diff --git a/.gitignore b/.gitignore
index bf13b40..74c1e3e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,6 @@
-target/
-eclipse_config/
-.settings/
-thirdparty/
-bin/
-*.class
+target/
+eclipse_config/
+.settings/
+thirdparty/
+bin/
+*.class
diff --git a/bundles/.gitignore b/bundles/.gitignore
index 834befa..95cea85 100644
--- a/bundles/.gitignore
+++ b/bundles/.gitignore
@@ -1,3 +1,3 @@
-/src
-/.settings
-/target
+/src
+/.settings
+/target
diff --git a/bundles/org.eclipse.uomo.business.tests/.classpath b/bundles/org.eclipse.uomo.business.tests/.classpath
index 0b1bcf9..9bc33d3 100644
--- a/bundles/org.eclipse.uomo.business.tests/.classpath
+++ b/bundles/org.eclipse.uomo.business.tests/.classpath
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src/"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/bundles/org.eclipse.uomo.business.tests/.gitignore b/bundles/org.eclipse.uomo.business.tests/.gitignore
index ea8c4bf..0b42d2d 100644
--- a/bundles/org.eclipse.uomo.business.tests/.gitignore
+++ b/bundles/org.eclipse.uomo.business.tests/.gitignore
@@ -1 +1 @@
-/target
+/target
diff --git a/bundles/org.eclipse.uomo.business.tests/.settings/.gitignore b/bundles/org.eclipse.uomo.business.tests/.settings/.gitignore
index 0924da4..c14d360 100644
--- a/bundles/org.eclipse.uomo.business.tests/.settings/.gitignore
+++ b/bundles/org.eclipse.uomo.business.tests/.settings/.gitignore
@@ -1 +1 @@
-/org.eclipse.m2e.core.prefs
+/org.eclipse.m2e.core.prefs
diff --git a/bundles/org.eclipse.uomo.business.tests/META-INF/MANIFEST.MF b/bundles/org.eclipse.uomo.business.tests/META-INF/MANIFEST.MF
index 5767b13..8f1cb1a 100644
--- a/bundles/org.eclipse.uomo.business.tests/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.uomo.business.tests/META-INF/MANIFEST.MF
@@ -1,9 +1,9 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: UOMo Business Tests
-Bundle-SymbolicName: org.eclipse.uomo.business.tests
-Bundle-Version: 0.7.0.qualifier
-Bundle-Vendor: Eclipse Org
-Fragment-Host: org.eclipse.uomo.business;bundle-version="0.7.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Require-Bundle: org.junit;bundle-version="4.11.0"
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: UOMo Business Tests
+Bundle-SymbolicName: org.eclipse.uomo.business.tests
+Bundle-Version: 0.7.0.qualifier
+Bundle-Vendor: Eclipse Org
+Fragment-Host: org.eclipse.uomo.business;bundle-version="0.7.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Require-Bundle: org.junit;bundle-version="4.11.0"
diff --git a/bundles/org.eclipse.uomo.business.tests/build.properties b/bundles/org.eclipse.uomo.business.tests/build.properties
index 34d2e4d..41eb6ad 100644
--- a/bundles/org.eclipse.uomo.business.tests/build.properties
+++ b/bundles/org.eclipse.uomo.business.tests/build.properties
@@ -1,4 +1,4 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/bundles/org.eclipse.uomo.business/.classpath b/bundles/org.eclipse.uomo.business/.classpath
index a625c7f..23d1b61 100644
--- a/bundles/org.eclipse.uomo.business/.classpath
+++ b/bundles/org.eclipse.uomo.business/.classpath
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src/main/java/"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/main/java/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/bundles/org.eclipse.uomo.business/.gitignore b/bundles/org.eclipse.uomo.business/.gitignore
index e7da900..1a315ce 100644
--- a/bundles/org.eclipse.uomo.business/.gitignore
+++ b/bundles/org.eclipse.uomo.business/.gitignore
@@ -1,3 +1,3 @@
-/target
-/.settings
-/target
+/target
+/.settings
+/target
diff --git a/bundles/org.eclipse.uomo.business/META-INF/MANIFEST.MF b/bundles/org.eclipse.uomo.business/META-INF/MANIFEST.MF
index ad457ac..c6b0579 100644
--- a/bundles/org.eclipse.uomo.business/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.uomo.business/META-INF/MANIFEST.MF
@@ -1,9 +1,9 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: UOMo Business
-Bundle-SymbolicName: org.eclipse.uomo.business
-Bundle-Version: 0.7.0.qualifier
-Bundle-Vendor: Eclipse.org
-Require-Bundle: org.eclipse.uomo.core;bundle-version="0.7.0",
- org.eclipse.uomo.units;bundle-version="0.5.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: UOMo Business
+Bundle-SymbolicName: org.eclipse.uomo.business
+Bundle-Version: 0.7.0.qualifier
+Bundle-Vendor: Eclipse.org
+Require-Bundle: org.eclipse.uomo.core;bundle-version="0.7.0",
+ org.eclipse.uomo.units;bundle-version="0.5.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/money/MoneyAmount.java b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/money/MoneyAmount.java
index e62041b..dfb8d2c 100644
--- a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/money/MoneyAmount.java
+++ b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/money/MoneyAmount.java
@@ -1,713 +1,713 @@
-/**
- * Copyright (c) 2005, 2014, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
- */
-package org.eclipse.uomo.business.money;
-
-import java.math.BigInteger;
-import java.math.MathContext;
-import java.text.FieldPosition;
-import java.text.NumberFormat;
-
-import org.eclipse.uomo.business.internal.CurrencyUnit;
-import org.eclipse.uomo.business.internal.MonetaryAmount;
-import org.eclipse.uomo.business.internal.MonetaryOperator;
-import org.eclipse.uomo.business.types.IMoney;
-import org.eclipse.uomo.core.UOMoRuntimeException;
-import org.eclipse.uomo.units.AbstractConverter;
-import org.eclipse.uomo.units.IMeasure;
-import org.eclipse.uomo.units.QuantityAmount;
-import org.eclipse.uomo.units.impl.converter.RationalConverter;
-import org.unitsofmeasurement.unit.IncommensurableException;
-import org.unitsofmeasurement.unit.UnconvertibleException;
-import org.unitsofmeasurement.unit.Unit;
-import org.unitsofmeasurement.unit.UnitConverter;
-
-import com.ibm.icu.math.BigDecimal;
-import com.ibm.icu.util.Currency;
-
-/**
- * This class represents an amount of money specified in a given
- * {@link Currency} (convenience method).
- * 
- * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author <a href="mailto:units@catmedia.us">Werner Keil</a>
- * @version 0.7, $Date: 2014-08-03 $
- */
-public class MoneyAmount extends QuantityAmount<IMoney> implements IMoney, MonetaryAmount,
-		Comparable<MonetaryAmount> {
-
-	/**
-	 * Holds the base unit for money quantities (symbol "$").
-	 */
-	public final static MoneyUnit<IMoney> UNIT = new MoneyUnit<IMoney>(
-			"$");
-
-	/**
-	 * Creates a money amount always on the heap independently from the current
-	 * {@link javolution.context.AllocatorContext allocator context}. To allow
-	 * for custom object allocation policies, static factory methods
-	 * <code>valueOf(...)</code> are recommended.
-	 * 
-	 * @param value
-	 *            the value stated in the specified currency.
-	 * @param currency
-	 *            the currency in which the value is stated.
-	 */
-	public MoneyAmount(Number value, MoneyUnit unit) {
-		super(value, unit);
-	}
-
-	/**
-	 * Returns the money amount corresponding to the specified Number value
-	 * and currency.
-	 * 
-	 * @param value
-	 *            the value stated in the specified currency.
-	 * @param currency
-	 *            the currency in which the value is stated.
-	 * @return the corresponding amount.
-	 */
-	public static MoneyAmount of(Number value, CurrencyUnit currency) {
-		return new MoneyAmount(value, (MoneyUnit)currency);
-	}
-	
-	/**
-	 * Returns the money amount corresponding to the specified Number value
-	 * and currency.
-	 * 
-	 * @param value
-	 *            the value stated in the specified currency.
-	 * @param currency
-	 *            the currency in which the value is stated.
-	 * @return the corresponding amount.
-	 */
-//	static MoneyAmount of(Number value, java.util.Currency currency) {
-//		MoneyAmount amount = new MoneyAmount(value, currency);
-//		return amount;
-//	}
-
-	/**
-	 * Returns the money amount corresponding to the specified Number value
-	 * and currency.
-	 * 
-	 * @param value
-	 *            the value stated in the specified currency.
-	 * @param currency
-	 *            the currency in which the value is stated.
-	 * @return the corresponding amount.
-	 */
-	public static MoneyAmount of(Number value, Unit<?> currency) {
-		return new MoneyAmount(value, (MoneyUnit) currency);
-	}
-
-	/**
-	 * Returns the money amount corresponding to the specified value and cents.
-	 * 
-	 * @param value
-	 *            the integer value in the specified currency.
-	 * @param cents
-	 *            the cents value in the specified currency.
-	 * @param currency
-	 *            the currency in which the value and cents are stated.
-	 * @return the corresponding amount.
-	 */
-	public static MoneyAmount of(long value, int cents, Currency currency) {
-		return new MoneyAmount(BigDecimal.valueOf(value * 100
-				+ cents, -2), (MoneyUnit) currency);
-	}
-
-	/**
-	 * Returns the money amount corresponding to the specified generic amount.
-	 * 
-	 * @param amount
-	 *            the raw amount.
-	 * @return the corresponding money amount stated in an existing
-	 *         {@link Currency}.
-	 * @throws ClassCastException
-	 *             if the SI unit of the specified amount is not a
-	 *             {@link Currency}.
-	 */
-	public static MoneyAmount of(QuantityAmount<IMoney> amount) {
-		// MoneyAmount amountSI = amount.toSI();
-		return MoneyAmount.of(BigDecimal.valueOf(amount.getValue()
-				.doubleValue()), amount.unit().getSystemUnit());
-	}
-
-	
-	/**
-	 * Returns the money amount corresponding to the specified Number value
-	 * and currency code.
-	 * 
-	 * @param value
-	 *            the value stated in the specified currency.
-	 * @param currency
-	 *            the currency in which the value is stated.
-	 * @return the corresponding amount.
-	 */
-	public static MoneyAmount of(String code, Number value) {
-		return new MoneyAmount(value, MoneyUnit.of(code));
-	}
-	
-	/**
-	 * Overrides the default {@link #toString()} to show only the currency
-	 * {@link Currency#getFractionDigits() fraction digits} of the associated
-	 * currency (e.g. rounding to closest cents).
-	 * 
-	 * @return the string representation of this money amount.
-	 */
-	public String toStringLocale() {
-		BigDecimal value = (BigDecimal) this.getNumber();
-		// int digits = ((Currency) this.getUnit()).getDefaultFractionDigits();
-		// int exponent = value.getExponent();
-		// LargeInteger significand = value.getSignificand();
-		// int scale = exponent + digits;
-		// significand = significand.E(scale);
-		// exponent -= scale;
-		// value = BigDecimal.valueOf(significand, exponent);
-		NumberFormat numberFormat = NumberFormat.getInstance();
-		StringBuffer tmp = new StringBuffer();
-		numberFormat.format(value, tmp, new FieldPosition(0));
-		tmp.append(' ');
-		tmp.append(this.unit().toString());
-		return tmp.toString();
-	}
-
-	// public MoneyAmount opposite() {
-	// return MoneyAmount.valueOf(_value.opposite(), getCurrency());
-	// }
-
-	protected MoneyAmount plus(IMoney that) {
-		// Measure<BigDecimal, ?> amount = that.to((Unit) getCurrency());
-		return MoneyAmount.of(this.getNumber().doubleValue()
-				+ that.value().doubleValue(), getCurrency());
-	}
-	
-	protected MoneyAmount plus(MoneyAmount that) {
-		// Measure<BigDecimal, ?> amount = that.to((Unit) getCurrency());
-		return MoneyAmount.of(this.getNumber().doubleValue()
-				+ that.getNumber().doubleValue(), getCurrency());
-	}
-
-	protected MoneyAmount minus(MoneyAmount that) {
-		// MoneyAmount amount = that.to((Unit) getCurrency());
-		return MoneyAmount.of(this.getNumber().doubleValue()
-				- that.getNumber().doubleValue(), getCurrency());
-	}
-
-	public MoneyAmount multiply(Number that) {
-		return MoneyAmount.of(
-				getNumber().doubleValue() * that.doubleValue(), getCurrency());
-	}
-
-	public MoneyAmount multiply(long n) {
-		return MoneyAmount.of(getNumber().longValue() * n,
-				getCurrency());
-	}
-
-	public MoneyAmount multiply(MonetaryAmount that) {
-		MoneyAmount ma = (MoneyAmount)that;
-		return times(ma);
-	}
-	
-	protected MoneyAmount times(MoneyAmount that) {
-		Unit<?> unit = unit().multiply(that.unit());
-		return MoneyAmount.of(((BigDecimal) getNumber())
-				.multiply((BigDecimal) that.getNumber()), unit);
-	}
-
-	public MoneyAmount pow(int exp) {
-		return MoneyAmount.of(((BigDecimal) getNumber()).pow(BigDecimal
-				.valueOf(exp)), unit().pow(exp));
-	}
-
-	// protected MoneyAmount inverse() {
-	// return MoneyAmount.valueOf(((BigDecimal) getNumber()).inverse(),
-	// unit().inverse());
-	// }
-
-	public MoneyAmount divide(long n) {
-		return MoneyAmount.of(getNumber().longValue() / n,
-				getCurrency());
-	}
-
-	protected MoneyAmount divide(MoneyAmount that) {
-		Unit<?> unit = unit().divide(that.unit());
-		return MoneyAmount.of(((BigDecimal) getNumber())
-				.divide((BigDecimal) that.getNumber()), unit);
-	}
-
-	public MoneyAmount copy() {
-		return MoneyAmount.of(getNumber(), getCurrency());
-	}
-
-	/**
-	 * Get the unit (convenience to avoid cast).
-	 * 
-	 * @draft UOMo 0.5
-	 * @provisional This API might change or be removed in a future release.
-	 */
-	@SuppressWarnings("unchecked")
-	public MoneyUnit<IMoney> unit() {
-		return (MoneyUnit<IMoney>) getUnit();
-	}
-
-	public int compareTo(IMoney o) {
-		// TODO Auto-generated method stub
-		return 0;
-	}
-
-	public double doubleValue(Unit<IMoney> unit) {
-		Unit<IMoney> myUnit = unit();
-		try {
-			UnitConverter converter = unit.getConverterToAny(myUnit);
-			return converter.convert(getNumber().doubleValue());
-		} catch (UnconvertibleException e) {
-			throw e;
-		} catch (IncommensurableException e) {
-			throw new IllegalArgumentException(e.getMessage());
-		}
-	}
-
-	public long longValue(Unit<IMoney> unit) throws ArithmeticException {
-		Unit<IMoney> myUnit = unit();
-		try {
-			UnitConverter converter = unit.getConverterToAny(myUnit);
-			return (converter.convert(BigDecimal.valueOf(super.getNumber()
-					.longValue())).longValue());
-		} catch (UnconvertibleException e) {
-			throw e;
-		} catch (IncommensurableException e) {
-			throw new IllegalArgumentException(e.getMessage());
-		}
-	}
-
-	public IMeasure<IMoney> divide(IMeasure<?> that) {
-		return divide((MoneyAmount) that);
-	}
-
-	public IMeasure<IMoney> multiply(IMeasure<?> that) {
-		return multiply((MonetaryAmount) that);
-	}
-
-	public IMeasure<IMoney> to(Unit<IMoney> unit) {
-		return to(unit, MathContext.DECIMAL32);
-	}
-
-	protected IMeasure<IMoney> to(Unit<IMoney> unit, MathContext ctx) {
-		if (this.unit().equals(unit))
-			return this;
-		UnitConverter cvtr = this.unit().getConverterTo(unit);
-		if (cvtr == AbstractConverter.IDENTITY)
-			return (IMeasure<IMoney>) of(this.getNumber(), unit);
-		return (IMeasure<IMoney>) of(convert(this.getNumber(), cvtr, ctx),
-				unit);
-	}
-
-	// Try to convert the specified value.
-	private static Number convert(Number value, UnitConverter cvtr,
-			MathContext ctx) {
-		if (cvtr instanceof RationalConverter) { // Try converting through Field
-													// methods.
-			RationalConverter rCvtr = (RationalConverter) cvtr;
-			BigInteger dividend = rCvtr.getDividend();
-			BigInteger divisor = rCvtr.getDivisor();
-			if (dividend.abs().compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0)
-				throw new ArithmeticException("Multiplier overflow");
-			if (divisor.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0)
-				throw new ArithmeticException("Divisor overflow");
-			return (value.longValue() * dividend.longValue())
-					/ (divisor.longValue());
-		} else if (cvtr instanceof AbstractConverter.Compound
-				&& cvtr.isLinear()) { // Do it in two parts.
-			AbstractConverter.Compound compound = (AbstractConverter.Compound) cvtr;
-			Number firstConversion = convert(value, compound.getRight(), ctx);
-			Number secondConversion = convert(firstConversion,
-					compound.getLeft(), ctx);
-			return secondConversion;
-		} else { // Try using BigDecimal as intermediate.
-			BigDecimal decimalValue = BigDecimal.valueOf(value.doubleValue());
-			Number newValue = cvtr.convert(decimalValue.toBigDecimal(), ctx);
-			return newValue;
-			// if (((FieldNumber)value) instanceof Decimal)
-			// return (N)((FieldNumber)Decimal.valueOf(newValue));
-			// if (((FieldNumber)value) instanceof Float64)
-			// return (N)((FieldNumber)Float64.valueOf(newValue.doubleValue()));
-			// throw new ArithmeticException(
-			// "Generic amount conversion not implemented for amount of type " +
-			// value.getClass());
-		}
-	}
-	
-	private final BigDecimal bigNumber() {
-		if (getNumber() instanceof BigDecimal) {
-			return (BigDecimal)getNumber();
-		} else {
-			throw new UOMoRuntimeException(
-					new IllegalArgumentException("Cannot represent as BigDecimal"));
-		}
-	}
-
-	/**
-	 * Generate a 'preference neutral' string from Money value.
-	 * 
-	 * @return java.lang.String
-	 */
-	public String serialize() {
-		return null;
-	}
-
-	public Number value() {
-		return getNumber();
-	}
-
-	public IMeasure<? extends IMeasure<IMoney>> inverse() {
-		final IMeasure<? extends IMeasure<IMoney>> m = of(value(), unit()
-				.inverse());
-		return m;
-	}
-
-	public int compareTo(MonetaryAmount o) {
-		// TODO Auto-generated method stub
-		return 0;
-	}
-
-	 
-	public MonetaryAmount abs() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public MonetaryAmount add(Number augend) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	 
-	public MonetaryAmount divide(MonetaryAmount divisor) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	 
-	public MonetaryAmount divide(Number divisor) {
-		// TODO Auto-generated method stub
-		//return of((BigDecimal)value()).divide((BigDecimal)divisor));
-		return null;
-	}
-
-	 
-	public MonetaryAmount[] divideAndRemainder(MonetaryAmount divisor) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	 
-	public MonetaryAmount[] divideAndRemainder(Number divisor) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	 
-	public MonetaryAmount divideToIntegralValue(MonetaryAmount divisor) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	 
-	public MonetaryAmount divideToIntegralValue(Number divisor) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	 
-	public MonetaryAmount negate() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	 
-	public MonetaryAmount plus() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public MonetaryAmount subtract(Number subtrahend) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	 
-	public MonetaryAmount ulp() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	 
-	public MonetaryAmount remainder(MonetaryAmount divisor) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	 
-	public MonetaryAmount remainder(Number divisor) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	 
-	public MonetaryAmount scaleByPowerOfTen(int n) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	 
-	public boolean isZero() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	 
-	public boolean isPositive() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	 
-	public boolean isPositiveOrZero() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	 
-	public boolean isNegative() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	 
-	public boolean isNegativeOrZero() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	public MonetaryAmount from(Number amount) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public MonetaryAmount from(CurrencyUnit currency, Number amount) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	 
-	public MonetaryAmount with(MonetaryOperator operator) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see MonetaryAmount#getScale()
-	 */
-	public int getScale() {
-		return this.bigNumber().scale();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see MonetaryAmount#getPrecision()
-	 */
-	public int getPrecision() {
-		return bigNumber().toBigDecimal().precision();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see MonetaryAmount#intValue()
-	 */
-	public int intValue() {
-		return this.getNumber().intValue();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see MonetaryAmount#intValueExact()
-	 */
-	public int intValueExact() {
-		return bigNumber().intValueExact();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see MonetaryAmount#longValue()
-	 */
-	public long longValue() {
-		return this.getNumber().longValue();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see MonetaryAmount#longValueExact()
-	 */
-	public long longValueExact() {
-		return bigNumber().longValueExact();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see MonetaryAmount#floatValue()
-	 */
-	public float floatValue() {
-		return this.getNumber().floatValue();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see MonetaryAmount#doubleValue()
-	 */
-	public double doubleValue() {
-		return this.getNumber().doubleValue();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see MonetaryAmount#byteValue()
-	 */
-	public byte byteValue() {
-		return this.getNumber().byteValue();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see MonetaryAmount#shortValue()
-	 */
-	public short shortValue() {
-		return getNumber().shortValue();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see MonetaryAmount#shortValueExact()
-	 */
-	public short shortValueExact() {
-		return bigNumber().shortValueExact();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see MonetaryAmount#signum()
-	 */
-
-	public int signum() {
-		return bigNumber().signum();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see MonetaryAmount#toEngineeringString()
-	 */
-	public String toEngineeringString() {
-		return getCurrency().getCurrencyCode() + ' '
-				+ bigNumber().toBigDecimal().toEngineeringString();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see MonetaryAmount#toPlainString()
-	 */
-	public String toPlainString() {
-		return getCurrency().getCurrencyCode() + ' '
-				+ bigNumber().toBigDecimal().toPlainString();
-	}
-	 
-	public boolean isLessThan(MonetaryAmount amount) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	 
-	public boolean isLessThanOrEqualTo(MonetaryAmount amount) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	 
-	public boolean isGreaterThan(MonetaryAmount amount) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	 
-	public boolean isGreaterThanOrEqualTo(MonetaryAmount amount) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	 
-	public boolean isEqualTo(MonetaryAmount amount) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	 
-	public boolean isNotEqualTo(MonetaryAmount amount) {
-		return !getNumber().equals(amount);
-	}
-
-	public <T> T asType(Class<T> type) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public Class<?> getNumberType() {
-		return getNumber().getClass();
-	}
-
-	public CurrencyUnit getCurrency() {
-		return (CurrencyUnit)unit();
-	}
-
-	@Override
-	public IMoney add(IMeasure<IMoney> that) {
-		return plus((IMoney) that);
-	}
-
-	@Override
-	public MonetaryAmount add(MonetaryAmount augend) {
-		return plus((MoneyAmount) augend);
-	}
-
-	@Override
-	public IMeasure<IMoney> subtract(IMeasure<IMoney> that) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public MonetaryAmount subtract(MonetaryAmount subtrahend) {
-		// TODO Auto-generated method stub
-		return null;
-	}
+/**
+ * Copyright (c) 2005, 2014, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
+ */
+package org.eclipse.uomo.business.money;
+
+import java.math.BigInteger;
+import java.math.MathContext;
+import java.text.FieldPosition;
+import java.text.NumberFormat;
+
+import org.eclipse.uomo.business.internal.CurrencyUnit;
+import org.eclipse.uomo.business.internal.MonetaryAmount;
+import org.eclipse.uomo.business.internal.MonetaryOperator;
+import org.eclipse.uomo.business.types.IMoney;
+import org.eclipse.uomo.core.UOMoRuntimeException;
+import org.eclipse.uomo.units.AbstractConverter;
+import org.eclipse.uomo.units.IMeasure;
+import org.eclipse.uomo.units.QuantityAmount;
+import org.eclipse.uomo.units.impl.converter.RationalConverter;
+import org.unitsofmeasurement.unit.IncommensurableException;
+import org.unitsofmeasurement.unit.UnconvertibleException;
+import org.unitsofmeasurement.unit.Unit;
+import org.unitsofmeasurement.unit.UnitConverter;
+
+import com.ibm.icu.math.BigDecimal;
+import com.ibm.icu.util.Currency;
+
+/**
+ * This class represents an amount of money specified in a given
+ * {@link Currency} (convenience method).
+ * 
+ * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author <a href="mailto:units@catmedia.us">Werner Keil</a>
+ * @version 0.7, $Date: 2014-08-03 $
+ */
+public class MoneyAmount extends QuantityAmount<IMoney> implements IMoney, MonetaryAmount,
+		Comparable<MonetaryAmount> {
+
+	/**
+	 * Holds the base unit for money quantities (symbol "$").
+	 */
+	public final static MoneyUnit<IMoney> UNIT = new MoneyUnit<IMoney>(
+			"$");
+
+	/**
+	 * Creates a money amount always on the heap independently from the current
+	 * {@link javolution.context.AllocatorContext allocator context}. To allow
+	 * for custom object allocation policies, static factory methods
+	 * <code>valueOf(...)</code> are recommended.
+	 * 
+	 * @param value
+	 *            the value stated in the specified currency.
+	 * @param currency
+	 *            the currency in which the value is stated.
+	 */
+	public MoneyAmount(Number value, MoneyUnit unit) {
+		super(value, unit);
+	}
+
+	/**
+	 * Returns the money amount corresponding to the specified Number value
+	 * and currency.
+	 * 
+	 * @param value
+	 *            the value stated in the specified currency.
+	 * @param currency
+	 *            the currency in which the value is stated.
+	 * @return the corresponding amount.
+	 */
+	public static MoneyAmount of(Number value, CurrencyUnit currency) {
+		return new MoneyAmount(value, (MoneyUnit)currency);
+	}
+	
+	/**
+	 * Returns the money amount corresponding to the specified Number value
+	 * and currency.
+	 * 
+	 * @param value
+	 *            the value stated in the specified currency.
+	 * @param currency
+	 *            the currency in which the value is stated.
+	 * @return the corresponding amount.
+	 */
+//	static MoneyAmount of(Number value, java.util.Currency currency) {
+//		MoneyAmount amount = new MoneyAmount(value, currency);
+//		return amount;
+//	}
+
+	/**
+	 * Returns the money amount corresponding to the specified Number value
+	 * and currency.
+	 * 
+	 * @param value
+	 *            the value stated in the specified currency.
+	 * @param currency
+	 *            the currency in which the value is stated.
+	 * @return the corresponding amount.
+	 */
+	public static MoneyAmount of(Number value, Unit<?> currency) {
+		return new MoneyAmount(value, (MoneyUnit) currency);
+	}
+
+	/**
+	 * Returns the money amount corresponding to the specified value and cents.
+	 * 
+	 * @param value
+	 *            the integer value in the specified currency.
+	 * @param cents
+	 *            the cents value in the specified currency.
+	 * @param currency
+	 *            the currency in which the value and cents are stated.
+	 * @return the corresponding amount.
+	 */
+	public static MoneyAmount of(long value, int cents, Currency currency) {
+		return new MoneyAmount(BigDecimal.valueOf(value * 100
+				+ cents, -2), (MoneyUnit) currency);
+	}
+
+	/**
+	 * Returns the money amount corresponding to the specified generic amount.
+	 * 
+	 * @param amount
+	 *            the raw amount.
+	 * @return the corresponding money amount stated in an existing
+	 *         {@link Currency}.
+	 * @throws ClassCastException
+	 *             if the SI unit of the specified amount is not a
+	 *             {@link Currency}.
+	 */
+	public static MoneyAmount of(QuantityAmount<IMoney> amount) {
+		// MoneyAmount amountSI = amount.toSI();
+		return MoneyAmount.of(BigDecimal.valueOf(amount.getValue()
+				.doubleValue()), amount.unit().getSystemUnit());
+	}
+
+	
+	/**
+	 * Returns the money amount corresponding to the specified Number value
+	 * and currency code.
+	 * 
+	 * @param value
+	 *            the value stated in the specified currency.
+	 * @param currency
+	 *            the currency in which the value is stated.
+	 * @return the corresponding amount.
+	 */
+	public static MoneyAmount of(String code, Number value) {
+		return new MoneyAmount(value, MoneyUnit.of(code));
+	}
+	
+	/**
+	 * Overrides the default {@link #toString()} to show only the currency
+	 * {@link Currency#getFractionDigits() fraction digits} of the associated
+	 * currency (e.g. rounding to closest cents).
+	 * 
+	 * @return the string representation of this money amount.
+	 */
+	public String toStringLocale() {
+		BigDecimal value = (BigDecimal) this.getNumber();
+		// int digits = ((Currency) this.getUnit()).getDefaultFractionDigits();
+		// int exponent = value.getExponent();
+		// LargeInteger significand = value.getSignificand();
+		// int scale = exponent + digits;
+		// significand = significand.E(scale);
+		// exponent -= scale;
+		// value = BigDecimal.valueOf(significand, exponent);
+		NumberFormat numberFormat = NumberFormat.getInstance();
+		StringBuffer tmp = new StringBuffer();
+		numberFormat.format(value, tmp, new FieldPosition(0));
+		tmp.append(' ');
+		tmp.append(this.unit().toString());
+		return tmp.toString();
+	}
+
+	// public MoneyAmount opposite() {
+	// return MoneyAmount.valueOf(_value.opposite(), getCurrency());
+	// }
+
+	protected MoneyAmount plus(IMoney that) {
+		// Measure<BigDecimal, ?> amount = that.to((Unit) getCurrency());
+		return MoneyAmount.of(this.getNumber().doubleValue()
+				+ that.value().doubleValue(), getCurrency());
+	}
+	
+	protected MoneyAmount plus(MoneyAmount that) {
+		// Measure<BigDecimal, ?> amount = that.to((Unit) getCurrency());
+		return MoneyAmount.of(this.getNumber().doubleValue()
+				+ that.getNumber().doubleValue(), getCurrency());
+	}
+
+	protected MoneyAmount minus(MoneyAmount that) {
+		// MoneyAmount amount = that.to((Unit) getCurrency());
+		return MoneyAmount.of(this.getNumber().doubleValue()
+				- that.getNumber().doubleValue(), getCurrency());
+	}
+
+	public MoneyAmount multiply(Number that) {
+		return MoneyAmount.of(
+				getNumber().doubleValue() * that.doubleValue(), getCurrency());
+	}
+
+	public MoneyAmount multiply(long n) {
+		return MoneyAmount.of(getNumber().longValue() * n,
+				getCurrency());
+	}
+
+	public MoneyAmount multiply(MonetaryAmount that) {
+		MoneyAmount ma = (MoneyAmount)that;
+		return times(ma);
+	}
+	
+	protected MoneyAmount times(MoneyAmount that) {
+		Unit<?> unit = unit().multiply(that.unit());
+		return MoneyAmount.of(((BigDecimal) getNumber())
+				.multiply((BigDecimal) that.getNumber()), unit);
+	}
+
+	public MoneyAmount pow(int exp) {
+		return MoneyAmount.of(((BigDecimal) getNumber()).pow(BigDecimal
+				.valueOf(exp)), unit().pow(exp));
+	}
+
+	// protected MoneyAmount inverse() {
+	// return MoneyAmount.valueOf(((BigDecimal) getNumber()).inverse(),
+	// unit().inverse());
+	// }
+
+	public MoneyAmount divide(long n) {
+		return MoneyAmount.of(getNumber().longValue() / n,
+				getCurrency());
+	}
+
+	protected MoneyAmount divide(MoneyAmount that) {
+		Unit<?> unit = unit().divide(that.unit());
+		return MoneyAmount.of(((BigDecimal) getNumber())
+				.divide((BigDecimal) that.getNumber()), unit);
+	}
+
+	public MoneyAmount copy() {
+		return MoneyAmount.of(getNumber(), getCurrency());
+	}
+
+	/**
+	 * Get the unit (convenience to avoid cast).
+	 * 
+	 * @draft UOMo 0.5
+	 * @provisional This API might change or be removed in a future release.
+	 */
+	@SuppressWarnings("unchecked")
+	public MoneyUnit<IMoney> unit() {
+		return (MoneyUnit<IMoney>) getUnit();
+	}
+
+	public int compareTo(IMoney o) {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	public double doubleValue(Unit<IMoney> unit) {
+		Unit<IMoney> myUnit = unit();
+		try {
+			UnitConverter converter = unit.getConverterToAny(myUnit);
+			return converter.convert(getNumber().doubleValue());
+		} catch (UnconvertibleException e) {
+			throw e;
+		} catch (IncommensurableException e) {
+			throw new IllegalArgumentException(e.getMessage());
+		}
+	}
+
+	public long longValue(Unit<IMoney> unit) throws ArithmeticException {
+		Unit<IMoney> myUnit = unit();
+		try {
+			UnitConverter converter = unit.getConverterToAny(myUnit);
+			return (converter.convert(BigDecimal.valueOf(super.getNumber()
+					.longValue())).longValue());
+		} catch (UnconvertibleException e) {
+			throw e;
+		} catch (IncommensurableException e) {
+			throw new IllegalArgumentException(e.getMessage());
+		}
+	}
+
+	public IMeasure<IMoney> divide(IMeasure<?> that) {
+		return divide((MoneyAmount) that);
+	}
+
+	public IMeasure<IMoney> multiply(IMeasure<?> that) {
+		return multiply((MonetaryAmount) that);
+	}
+
+	public IMeasure<IMoney> to(Unit<IMoney> unit) {
+		return to(unit, MathContext.DECIMAL32);
+	}
+
+	protected IMeasure<IMoney> to(Unit<IMoney> unit, MathContext ctx) {
+		if (this.unit().equals(unit))
+			return this;
+		UnitConverter cvtr = this.unit().getConverterTo(unit);
+		if (cvtr == AbstractConverter.IDENTITY)
+			return (IMeasure<IMoney>) of(this.getNumber(), unit);
+		return (IMeasure<IMoney>) of(convert(this.getNumber(), cvtr, ctx),
+				unit);
+	}
+
+	// Try to convert the specified value.
+	private static Number convert(Number value, UnitConverter cvtr,
+			MathContext ctx) {
+		if (cvtr instanceof RationalConverter) { // Try converting through Field
+													// methods.
+			RationalConverter rCvtr = (RationalConverter) cvtr;
+			BigInteger dividend = rCvtr.getDividend();
+			BigInteger divisor = rCvtr.getDivisor();
+			if (dividend.abs().compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0)
+				throw new ArithmeticException("Multiplier overflow");
+			if (divisor.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0)
+				throw new ArithmeticException("Divisor overflow");
+			return (value.longValue() * dividend.longValue())
+					/ (divisor.longValue());
+		} else if (cvtr instanceof AbstractConverter.Compound
+				&& cvtr.isLinear()) { // Do it in two parts.
+			AbstractConverter.Compound compound = (AbstractConverter.Compound) cvtr;
+			Number firstConversion = convert(value, compound.getRight(), ctx);
+			Number secondConversion = convert(firstConversion,
+					compound.getLeft(), ctx);
+			return secondConversion;
+		} else { // Try using BigDecimal as intermediate.
+			BigDecimal decimalValue = BigDecimal.valueOf(value.doubleValue());
+			Number newValue = cvtr.convert(decimalValue.toBigDecimal(), ctx);
+			return newValue;
+			// if (((FieldNumber)value) instanceof Decimal)
+			// return (N)((FieldNumber)Decimal.valueOf(newValue));
+			// if (((FieldNumber)value) instanceof Float64)
+			// return (N)((FieldNumber)Float64.valueOf(newValue.doubleValue()));
+			// throw new ArithmeticException(
+			// "Generic amount conversion not implemented for amount of type " +
+			// value.getClass());
+		}
+	}
+	
+	private final BigDecimal bigNumber() {
+		if (getNumber() instanceof BigDecimal) {
+			return (BigDecimal)getNumber();
+		} else {
+			throw new UOMoRuntimeException(
+					new IllegalArgumentException("Cannot represent as BigDecimal"));
+		}
+	}
+
+	/**
+	 * Generate a 'preference neutral' string from Money value.
+	 * 
+	 * @return java.lang.String
+	 */
+	public String serialize() {
+		return null;
+	}
+
+	public Number value() {
+		return getNumber();
+	}
+
+	public IMeasure<? extends IMeasure<IMoney>> inverse() {
+		final IMeasure<? extends IMeasure<IMoney>> m = of(value(), unit()
+				.inverse());
+		return m;
+	}
+
+	public int compareTo(MonetaryAmount o) {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	 
+	public MonetaryAmount abs() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public MonetaryAmount add(Number augend) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	 
+	public MonetaryAmount divide(MonetaryAmount divisor) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	 
+	public MonetaryAmount divide(Number divisor) {
+		// TODO Auto-generated method stub
+		//return of((BigDecimal)value()).divide((BigDecimal)divisor));
+		return null;
+	}
+
+	 
+	public MonetaryAmount[] divideAndRemainder(MonetaryAmount divisor) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	 
+	public MonetaryAmount[] divideAndRemainder(Number divisor) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	 
+	public MonetaryAmount divideToIntegralValue(MonetaryAmount divisor) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	 
+	public MonetaryAmount divideToIntegralValue(Number divisor) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	 
+	public MonetaryAmount negate() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	 
+	public MonetaryAmount plus() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public MonetaryAmount subtract(Number subtrahend) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	 
+	public MonetaryAmount ulp() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	 
+	public MonetaryAmount remainder(MonetaryAmount divisor) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	 
+	public MonetaryAmount remainder(Number divisor) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	 
+	public MonetaryAmount scaleByPowerOfTen(int n) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	 
+	public boolean isZero() {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	 
+	public boolean isPositive() {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	 
+	public boolean isPositiveOrZero() {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	 
+	public boolean isNegative() {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	 
+	public boolean isNegativeOrZero() {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	public MonetaryAmount from(Number amount) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public MonetaryAmount from(CurrencyUnit currency, Number amount) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	 
+	public MonetaryAmount with(MonetaryOperator operator) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see MonetaryAmount#getScale()
+	 */
+	public int getScale() {
+		return this.bigNumber().scale();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see MonetaryAmount#getPrecision()
+	 */
+	public int getPrecision() {
+		return bigNumber().toBigDecimal().precision();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see MonetaryAmount#intValue()
+	 */
+	public int intValue() {
+		return this.getNumber().intValue();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see MonetaryAmount#intValueExact()
+	 */
+	public int intValueExact() {
+		return bigNumber().intValueExact();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see MonetaryAmount#longValue()
+	 */
+	public long longValue() {
+		return this.getNumber().longValue();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see MonetaryAmount#longValueExact()
+	 */
+	public long longValueExact() {
+		return bigNumber().longValueExact();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see MonetaryAmount#floatValue()
+	 */
+	public float floatValue() {
+		return this.getNumber().floatValue();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see MonetaryAmount#doubleValue()
+	 */
+	public double doubleValue() {
+		return this.getNumber().doubleValue();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see MonetaryAmount#byteValue()
+	 */
+	public byte byteValue() {
+		return this.getNumber().byteValue();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see MonetaryAmount#shortValue()
+	 */
+	public short shortValue() {
+		return getNumber().shortValue();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see MonetaryAmount#shortValueExact()
+	 */
+	public short shortValueExact() {
+		return bigNumber().shortValueExact();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see MonetaryAmount#signum()
+	 */
+
+	public int signum() {
+		return bigNumber().signum();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see MonetaryAmount#toEngineeringString()
+	 */
+	public String toEngineeringString() {
+		return getCurrency().getCurrencyCode() + ' '
+				+ bigNumber().toBigDecimal().toEngineeringString();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see MonetaryAmount#toPlainString()
+	 */
+	public String toPlainString() {
+		return getCurrency().getCurrencyCode() + ' '
+				+ bigNumber().toBigDecimal().toPlainString();
+	}
+	 
+	public boolean isLessThan(MonetaryAmount amount) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	 
+	public boolean isLessThanOrEqualTo(MonetaryAmount amount) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	 
+	public boolean isGreaterThan(MonetaryAmount amount) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	 
+	public boolean isGreaterThanOrEqualTo(MonetaryAmount amount) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	 
+	public boolean isEqualTo(MonetaryAmount amount) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	 
+	public boolean isNotEqualTo(MonetaryAmount amount) {
+		return !getNumber().equals(amount);
+	}
+
+	public <T> T asType(Class<T> type) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public Class<?> getNumberType() {
+		return getNumber().getClass();
+	}
+
+	public CurrencyUnit getCurrency() {
+		return (CurrencyUnit)unit();
+	}
+
+	@Override
+	public IMoney add(IMeasure<IMoney> that) {
+		return plus((IMoney) that);
+	}
+
+	@Override
+	public MonetaryAmount add(MonetaryAmount augend) {
+		return plus((MoneyAmount) augend);
+	}
+
+	@Override
+	public IMeasure<IMoney> subtract(IMeasure<IMoney> that) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public MonetaryAmount subtract(MonetaryAmount subtrahend) {
+		// TODO Auto-generated method stub
+		return null;
+	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/money/MoneyConverter.java b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/money/MoneyConverter.java
index 05f51a8..2372db1 100644
--- a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/money/MoneyConverter.java
+++ b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/money/MoneyConverter.java
@@ -1,287 +1,287 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
- */
-package org.eclipse.uomo.business.money;
-
-import static java.util.FormattableFlags.LEFT_JUSTIFY;
-
-import java.math.BigDecimal;
-import java.math.MathContext;
-import java.util.Formattable;
-import java.util.Formatter;
-import java.util.List;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.uomo.business.internal.CurrencyUnit;
-import org.eclipse.uomo.business.internal.ExchangeRate;
-import org.eclipse.uomo.business.internal.Messages;
-import org.eclipse.uomo.business.types.IMoney;
-import org.eclipse.uomo.units.AbstractConverter;
-import org.unitsofmeasurement.unit.Unit;
-import org.unitsofmeasurement.unit.UnitConverter;
-
-import com.ibm.icu.util.Currency;
-import com.ibm.icu.util.ULocale;
-
-/**
- * <p>
- * This class represents a converter between two currencies.
- * </p>
- * 
- * <p>
- * Currency converters convert values based upon the current exchange rate
- * {@link Currency#getExchangeRate() exchange rate}. If the
- * {@link Currency#getExchangeRate() exchange rate} from the target currency to
- * the source currency is not set, conversion fails. In others words, the
- * converter from a currency <code>A</code> to a currency <code>B</code> is
- * independant from the converter from <code>B</code> to <code>A</code>.
- * </p>
- * 
- * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author <a href="mailto:units@catmedia.us">Werner Keil</a>
- * @version 5.3, $Date: 2013-05-25 $
- * @deprecated use JSR 354
- */
-public class MoneyConverter extends AbstractConverter implements Formattable {
-
-	/**
-     * 
-     */
-	private static final long serialVersionUID = -3943843029548497620L;
-
-	/**
-	 * Holds the exchange rate.
-	 */
-	private final ExchangeRate rate;
-
-	private void checkFactor(Number factor) {
-		if (factor == null)
-			throw new UnsupportedOperationException(NLS.bind(
-					Messages.CurrencyConverter_exchangeRate_not_set,
-					rate.getBase(), rate.getTerm())); //$NON-NLS-1$
-	}
-
-	private CurrencyUnit fromJDK(java.util.Currency currency) {
-		// TODO use JDKAdapter
-		return fromICU(Currency.getInstance(currency.getCurrencyCode()));
-	}
-	
-	private CurrencyUnit fromICU(Currency currency) {
-		return MoneyCurrency.of(currency);
-	}
-
-	
-	/**
-	 * Creates the currency converter from the source currency to the target
-	 * currency.
-	 * 
-	 * @param source
-	 *            the source currency.
-	 * @param target
-	 *            the target currency.
-	 * @param factor
-	 *            the multiplier factor from source to target.
-	 * @return the corresponding converter.
-	 */
-	private MoneyConverter(CurrencyUnit source, CurrencyUnit target, Number factor) {
-		rate = new MoneyExchangeRate(source, target, factor);
-	}
-	
-	/**
-	 * Creates the currency converter from the source currency to the target
-	 * currency.
-	 * 
-	 * @param source
-	 *            the source currency.
-	 * @param target
-	 *            the target currency.
-	 * @param factor
-	 *            the multiplier factor from source to target.
-	 * @return the corresponding converter.
-	 */
-	private MoneyConverter(Currency source, Currency target, Number factor) {
-		rate = new MoneyExchangeRate(fromICU(source), fromICU(target), factor);
-	}
-
-	/**
-	 * Creates the currency converter from the source currency to the target
-	 * currency.
-	 * 
-	 * @param source
-	 *            the source currency.
-	 * @param target
-	 *            the target currency.
-	 * @param factor
-	 *            the multiplier factor from source to target.
-	 * @return the corresponding converter.
-	 */
-	@SuppressWarnings("unchecked")
-	public MoneyConverter(Unit<?> source, Unit<IMoney> target,
-			Number factor) {
-		
-			CurrencyUnit defCurrency = MoneyCurrency.of(Currency.getInstance(ULocale.getDefault()));
-			rate = new MoneyExchangeRate(defCurrency, defCurrency, factor);
-		
-	}
-
-	/**
-	 * Creates the currency converter from the source currency to the target
-	 * currency using <strong>JDK</strong> types.
-	 * 
-	 * @param source
-	 *            the source currency (<strong>JDK</strong>).
-	 * @param target
-	 *            the target currency (<strong>JDK</strong>).
-	 * @param factor
-	 *            the multiplier factor from source to target.
-	 * @return the corresponding converter.
-	 */
-	public MoneyConverter(java.util.Currency source,
-			java.util.Currency target, Number factor) {
-		rate = new MoneyExchangeRate(fromJDK(source), fromJDK(target), factor);
-	}
-
-	/**
-	 * Returns the source currency.
-	 * 
-	 * @return the source currency.
-	 */
-	public CurrencyUnit getSource() {
-		return rate.getBase();
-	}
-
-	/**
-	 * Returns the target currency.
-	 * 
-	 * @return the target currency.
-	 */
-	public CurrencyUnit getTarget() {
-		return rate.getTerm();
-	}
-
-	public MoneyConverter inverse() {
-		return new MoneyConverter(getTarget(), getSource(),
-				rate.getFactor());
-	}
-
-	public MoneyConverter negate() {
-		return new MoneyConverter(getSource(), getTarget(), -rate
-				.getFactor().doubleValue());
-	}
-
-	public double convert(double value) {
-		// Number factor = getExchangeRate(rate.getTarget());
-		Number factor = rate.getFactor();
-		checkFactor(factor);
-		return factor.doubleValue() * value;
-	}
-
-	public BigDecimal convert(BigDecimal value, MathContext ctx)
-			throws ArithmeticException {
-		// Number factor = rate.getSource().getExchangeRate(rate.getTarget());
-		Number factor = rate.getFactor();
-		checkFactor(factor);
-		if (factor instanceof BigDecimal)
-			return value.multiply((BigDecimal) factor, ctx);
-		if (factor instanceof Number) {
-			return value.multiply(
-					(BigDecimal.valueOf(((Number) factor).doubleValue())), ctx);
-		} else { // Reverts to double convert.
-			return value
-					.multiply(BigDecimal.valueOf(factor.doubleValue()), ctx);
-		}
-	}
-
-	public Number convert(Number value) {
-		if (value instanceof BigDecimal) {
-			return convert((BigDecimal) value, MathContext.DECIMAL128);
-		} else {
-			return convert(value.doubleValue());
-		}
-	}
-
-	@Override
-	public boolean equals(Object cvtr) {
-		if (!(cvtr instanceof MoneyConverter))
-			return false;
-		MoneyConverter that = (MoneyConverter) cvtr;
-		return this.getSource().equals(that.getSource())
-				&& this.getTarget().equals(that.getTarget());
-	}
-
-	@Override
-	public int hashCode() {
-		return getSource().hashCode() + getTarget().hashCode();
-	}
-
-	@Override
-	public final String toString() {
-		if (getSource().equals(getTarget())) {
-			return getSource().getCurrencyCode();
-		}
-		return String.format(Messages.CurrencyConverter_toString, getSource()
-				.getCurrencyCode(), getTarget().getCurrencyCode());
-	}
-
-	public boolean isLinear() {
-		return true;
-	}
-
-	public UnitConverter concatenate(UnitConverter converter) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public List<UnitConverter> getCompoundConverters() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public boolean isIdentity() {
-		return false;
-	}
-
-	public ExchangeRate getExchangeRate() {
-		return rate;
-	}
-
-	public void formatTo(Formatter fmt, int f, int width, int precision) {
-		StringBuilder sb = new StringBuilder();
-
-		// decide form of name
-		String name = getSource().toString();
-		String symbol = getSource().getCurrencyCode();
-		// if (fmt.locale().equals(Locale.FRANCE))
-		// name = frenchCompanyName;
-		// boolean alternate = (f & ALTERNATE) == ALTERNATE;
-		boolean usesymbol = true; // alternate || (precision != -1 && precision
-									// < 10);
-		String out = (usesymbol ? symbol : name);
-
-		// apply precision
-		if (precision == -1 || out.length() < precision) {
-			// write it all
-			sb.append(out);
-		} else {
-			sb.append(out.substring(0, precision - 1)).append('*');
-		}
-
-		// apply width and justification
-		int len = sb.length();
-		if (len < width)
-			for (int i = 0; i < width - len; i++)
-				if ((f & LEFT_JUSTIFY) == LEFT_JUSTIFY)
-					sb.append(' ');
-				else
-					sb.insert(0, ' ');
-
-		fmt.format(sb.toString());
-	}
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
+ */
+package org.eclipse.uomo.business.money;
+
+import static java.util.FormattableFlags.LEFT_JUSTIFY;
+
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.util.Formattable;
+import java.util.Formatter;
+import java.util.List;
+
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.uomo.business.internal.CurrencyUnit;
+import org.eclipse.uomo.business.internal.ExchangeRate;
+import org.eclipse.uomo.business.internal.Messages;
+import org.eclipse.uomo.business.types.IMoney;
+import org.eclipse.uomo.units.AbstractConverter;
+import org.unitsofmeasurement.unit.Unit;
+import org.unitsofmeasurement.unit.UnitConverter;
+
+import com.ibm.icu.util.Currency;
+import com.ibm.icu.util.ULocale;
+
+/**
+ * <p>
+ * This class represents a converter between two currencies.
+ * </p>
+ * 
+ * <p>
+ * Currency converters convert values based upon the current exchange rate
+ * {@link Currency#getExchangeRate() exchange rate}. If the
+ * {@link Currency#getExchangeRate() exchange rate} from the target currency to
+ * the source currency is not set, conversion fails. In others words, the
+ * converter from a currency <code>A</code> to a currency <code>B</code> is
+ * independant from the converter from <code>B</code> to <code>A</code>.
+ * </p>
+ * 
+ * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author <a href="mailto:units@catmedia.us">Werner Keil</a>
+ * @version 5.3, $Date: 2013-05-25 $
+ * @deprecated use JSR 354
+ */
+public class MoneyConverter extends AbstractConverter implements Formattable {
+
+	/**
+     * 
+     */
+	private static final long serialVersionUID = -3943843029548497620L;
+
+	/**
+	 * Holds the exchange rate.
+	 */
+	private final ExchangeRate rate;
+
+	private void checkFactor(Number factor) {
+		if (factor == null)
+			throw new UnsupportedOperationException(NLS.bind(
+					Messages.CurrencyConverter_exchangeRate_not_set,
+					rate.getBase(), rate.getTerm())); //$NON-NLS-1$
+	}
+
+	private CurrencyUnit fromJDK(java.util.Currency currency) {
+		// TODO use JDKAdapter
+		return fromICU(Currency.getInstance(currency.getCurrencyCode()));
+	}
+	
+	private CurrencyUnit fromICU(Currency currency) {
+		return MoneyCurrency.of(currency);
+	}
+
+	
+	/**
+	 * Creates the currency converter from the source currency to the target
+	 * currency.
+	 * 
+	 * @param source
+	 *            the source currency.
+	 * @param target
+	 *            the target currency.
+	 * @param factor
+	 *            the multiplier factor from source to target.
+	 * @return the corresponding converter.
+	 */
+	private MoneyConverter(CurrencyUnit source, CurrencyUnit target, Number factor) {
+		rate = new MoneyExchangeRate(source, target, factor);
+	}
+	
+	/**
+	 * Creates the currency converter from the source currency to the target
+	 * currency.
+	 * 
+	 * @param source
+	 *            the source currency.
+	 * @param target
+	 *            the target currency.
+	 * @param factor
+	 *            the multiplier factor from source to target.
+	 * @return the corresponding converter.
+	 */
+	private MoneyConverter(Currency source, Currency target, Number factor) {
+		rate = new MoneyExchangeRate(fromICU(source), fromICU(target), factor);
+	}
+
+	/**
+	 * Creates the currency converter from the source currency to the target
+	 * currency.
+	 * 
+	 * @param source
+	 *            the source currency.
+	 * @param target
+	 *            the target currency.
+	 * @param factor
+	 *            the multiplier factor from source to target.
+	 * @return the corresponding converter.
+	 */
+	@SuppressWarnings("unchecked")
+	public MoneyConverter(Unit<?> source, Unit<IMoney> target,
+			Number factor) {
+		
+			CurrencyUnit defCurrency = MoneyCurrency.of(Currency.getInstance(ULocale.getDefault()));
+			rate = new MoneyExchangeRate(defCurrency, defCurrency, factor);
+		
+	}
+
+	/**
+	 * Creates the currency converter from the source currency to the target
+	 * currency using <strong>JDK</strong> types.
+	 * 
+	 * @param source
+	 *            the source currency (<strong>JDK</strong>).
+	 * @param target
+	 *            the target currency (<strong>JDK</strong>).
+	 * @param factor
+	 *            the multiplier factor from source to target.
+	 * @return the corresponding converter.
+	 */
+	public MoneyConverter(java.util.Currency source,
+			java.util.Currency target, Number factor) {
+		rate = new MoneyExchangeRate(fromJDK(source), fromJDK(target), factor);
+	}
+
+	/**
+	 * Returns the source currency.
+	 * 
+	 * @return the source currency.
+	 */
+	public CurrencyUnit getSource() {
+		return rate.getBase();
+	}
+
+	/**
+	 * Returns the target currency.
+	 * 
+	 * @return the target currency.
+	 */
+	public CurrencyUnit getTarget() {
+		return rate.getTerm();
+	}
+
+	public MoneyConverter inverse() {
+		return new MoneyConverter(getTarget(), getSource(),
+				rate.getFactor());
+	}
+
+	public MoneyConverter negate() {
+		return new MoneyConverter(getSource(), getTarget(), -rate
+				.getFactor().doubleValue());
+	}
+
+	public double convert(double value) {
+		// Number factor = getExchangeRate(rate.getTarget());
+		Number factor = rate.getFactor();
+		checkFactor(factor);
+		return factor.doubleValue() * value;
+	}
+
+	public BigDecimal convert(BigDecimal value, MathContext ctx)
+			throws ArithmeticException {
+		// Number factor = rate.getSource().getExchangeRate(rate.getTarget());
+		Number factor = rate.getFactor();
+		checkFactor(factor);
+		if (factor instanceof BigDecimal)
+			return value.multiply((BigDecimal) factor, ctx);
+		if (factor instanceof Number) {
+			return value.multiply(
+					(BigDecimal.valueOf(((Number) factor).doubleValue())), ctx);
+		} else { // Reverts to double convert.
+			return value
+					.multiply(BigDecimal.valueOf(factor.doubleValue()), ctx);
+		}
+	}
+
+	public Number convert(Number value) {
+		if (value instanceof BigDecimal) {
+			return convert((BigDecimal) value, MathContext.DECIMAL128);
+		} else {
+			return convert(value.doubleValue());
+		}
+	}
+
+	@Override
+	public boolean equals(Object cvtr) {
+		if (!(cvtr instanceof MoneyConverter))
+			return false;
+		MoneyConverter that = (MoneyConverter) cvtr;
+		return this.getSource().equals(that.getSource())
+				&& this.getTarget().equals(that.getTarget());
+	}
+
+	@Override
+	public int hashCode() {
+		return getSource().hashCode() + getTarget().hashCode();
+	}
+
+	@Override
+	public final String toString() {
+		if (getSource().equals(getTarget())) {
+			return getSource().getCurrencyCode();
+		}
+		return String.format(Messages.CurrencyConverter_toString, getSource()
+				.getCurrencyCode(), getTarget().getCurrencyCode());
+	}
+
+	public boolean isLinear() {
+		return true;
+	}
+
+	public UnitConverter concatenate(UnitConverter converter) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public List<UnitConverter> getCompoundConverters() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public boolean isIdentity() {
+		return false;
+	}
+
+	public ExchangeRate getExchangeRate() {
+		return rate;
+	}
+
+	public void formatTo(Formatter fmt, int f, int width, int precision) {
+		StringBuilder sb = new StringBuilder();
+
+		// decide form of name
+		String name = getSource().toString();
+		String symbol = getSource().getCurrencyCode();
+		// if (fmt.locale().equals(Locale.FRANCE))
+		// name = frenchCompanyName;
+		// boolean alternate = (f & ALTERNATE) == ALTERNATE;
+		boolean usesymbol = true; // alternate || (precision != -1 && precision
+									// < 10);
+		String out = (usesymbol ? symbol : name);
+
+		// apply precision
+		if (precision == -1 || out.length() < precision) {
+			// write it all
+			sb.append(out);
+		} else {
+			sb.append(out.substring(0, precision - 1)).append('*');
+		}
+
+		// apply width and justification
+		int len = sb.length();
+		if (len < width)
+			for (int i = 0; i < width - len; i++)
+				if ((f & LEFT_JUSTIFY) == LEFT_JUSTIFY)
+					sb.append(' ');
+				else
+					sb.insert(0, ' ');
+
+		fmt.format(sb.toString());
+	}
+}
diff --git a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/money/MoneyCurrency.java b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/money/MoneyCurrency.java
index cf3eec6..e9c1b80 100644
--- a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/money/MoneyCurrency.java
+++ b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/money/MoneyCurrency.java
@@ -1,710 +1,710 @@
-/**
- * Copyright (c) 2006, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.business.money;
-
-import static org.eclipse.uomo.business.money.MonetaryUnits.ISO_NAMESPACE;
-
-//import java.util.Currency;
-import java.util.Locale;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.logging.Logger;
-
-import org.eclipse.uomo.business.internal.CurrencyUnit;
-import org.eclipse.uomo.business.internal.Localizable;
-
-import com.ibm.icu.util.Currency;
-import com.ibm.icu.util.ULocale;
-
-/**
- * Adapter that implements the  {@link CurrencyUnit} interface using the
- * ICU4J {@link com.ibm.icu.util.Currency}.
- * 
- * @version 0.2.3
- * @author Werner Keil
- * @deprecated merge into MoneyUnit
- */
-public class MoneyCurrency extends com.ibm.icu.util.Currency implements CurrencyUnit, Localizable {
-
-	/**
-	 * serialVersionUID.
-	 */
-	private static final long serialVersionUID = -2523936311372374236L;
-
-	/** namespace for this currency. */
-	private final String namespace;
-	/** currency code for this currency. */
-	private final String currencyCode;
-	/** valid from, or {@code null}. */
-	private final Long validFrom;
-	/** valid until, or {@code null}. */
-	private final Long validUntil;
-	/** true, if legal tender. */
-	private final boolean legalTender;
-	/** true, if it is a virtual currency. */
-	private final boolean virtual;
-
-	private static final Map<String, MoneyCurrency> CACHED = new ConcurrentHashMap<String, MoneyCurrency>();
-
-	private static final Logger LOGGER = Logger.getLogger(MoneyCurrency.class
-			.getName());
-
-	/**
-	 * Private constructor.
-	 * 
-	 * @param currency
-	 */
-	private MoneyCurrency(String namespace, String code, int numCode,
-			int fractionDigits, Long validFrom, Long validUntil, boolean legal,
-			boolean virtual) {
-		super(code);
-		this.namespace = namespace;
-		this.currencyCode = code;
-		this.validFrom = validFrom;
-		this.validUntil = validUntil;
-		this.legalTender = legal;
-		this.virtual = virtual;
-	}
-
-	/**
-	 * Private constructor.
-	 * 
-	 * @param currency
-	 */
-	private MoneyCurrency(Currency currency) {
-		super(currency != null ? currency.getCurrencyCode() : "");
-		if (currency == null) {
-			throw new IllegalArgumentException("Currency required.");
-		}
-		this.namespace = ISO_NAMESPACE;
-		this.currencyCode = currency.getCurrencyCode();
-		currency.getDefaultFractionDigits();
-		this.validFrom = null;
-		this.validUntil = null; // TODO Adapt for hisotoric one, e.g. AFA
-		this.legalTender = !this.currencyCode.startsWith("X"); // TODO check for
-																// each code in
-																// util.Currency
-																// here;
-		this.virtual = this.currencyCode.equals("XXX"); // TODO check for each
-														// code in util.Currency
-														// here;
-	}
-
-	/**
-	 * Access a new instance based on {@link Currency}.
-	 * 
-	 * @param currency
-	 *            the currency unitm not null.
-	 * @return the new instance, never null.
-	 */
-	public static MoneyCurrency of(Currency currency) {
-		String key = ISO_NAMESPACE + ':' + currency.getCurrencyCode();
-		MoneyCurrency cachedItem = CACHED.get(key);
-		if (cachedItem == null) {
-			cachedItem = new ICUCurrencyAdapter(currency);
-			CACHED.put(key, cachedItem);
-		}
-		return cachedItem;
-	}
-
-	/**
-	 * Access a new instance based on {@link Currency}.
-	 * 
-	 * @param currency
-	 *            the currency unitm not null.
-	 * @return the new instance, never null.
-	 */
-//	public static MoneyCurrency of(com.ibm.icu.util.Currency currency) {
-//		String key = ISO_NAMESPACE + ':' + currency.getCurrencyCode();
-//		MoneyCurrency cachedItem = CACHED.get(key);
-//		if (cachedItem == null) {
-//			cachedItem = new ICUCurrencyAdapter(currency);
-//			CACHED.put(key, cachedItem);
-//		}
-//		return cachedItem;
-//	}
-//	
-	/**
-	 * Access a new instance based on the ISO currency code. The code must
-	 * return a {@link Currency} when passed to
-	 * {@link Currency#getInstance(String)}.
-	 * 
-	 * @param currencyCode
-	 *            the ISO currency code, not null.
-	 * @return the corresponding {@link MonetaryCurrency} instance.
-	 */
-	public static MoneyCurrency of(String currencyCode) {
-		return of(Currency.getInstance(currencyCode));
-	}
-
-	/**
-	 * Access a new instance based on the ISO currency code. The code must
-	 * return a {@link Currency} when passed to
-	 * {@link Currency#getInstance(String)}.
-	 * 
-	 * @param namespace
-	 *            the target namespace.
-	 * @param currencyCode
-	 *            the ISO currency code, not null.
-	 * @return the corresponding {@link MonetaryCurrency} instance.
-	 */
-	public static MoneyCurrency of(String namespace, String currencyCode) {
-		String key = namespace + ':' + currencyCode;
-		MoneyCurrency cu = CACHED.get(key);
-		if (cu == null && namespace.equals(ISO_NAMESPACE)) {
-			return of(currencyCode);
-		}
-		return cu;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see javax.money.CurrencyUnit#isVirtual()
-	 */
-	
-	public boolean isVirtual() {
-		return virtual;
-	}
-
-	/**
-	 * Get the namepsace of this {@link CurrencyUnit}, returns 'ISO-4217'.
-	 */
-	
-	public String getNamespace() {
-		return namespace;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see javax.money.CurrencyUnit#getValidFrom()
-	 */
-	
-	public Long getValidFrom() {
-		return validFrom;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see javax.money.CurrencyUnit#getValidUntil()
-	 */
-	
-	public Long getValidUntil() {
-		return validUntil;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see javax.money.CurrencyUnit#getCurrencyCode()
-	 */
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see javax.money.CurrencyUnit#getNumericCode()
-	 */
-	
-//	public int getNumericCode() {
-//		return numericCode;
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see javax.money.CurrencyUnit#getDefaultFractionDigits()
-	 */
-	
-//	public int getDefaultFractionDigits() {
-//		return defaultFractionDigits;
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see javax.money.CurrencyUnit#isLegalTender()
-	 */
-	
-	public boolean isLegalTender() {
-		return legalTender;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Comparable#compareTo(java.lang.Object)
-	 */
-	public int compareTo(CurrencyUnit currency) {
-		int compare = getNamespace().compareTo(currency.getNamespace());
-		if (compare == 0) {
-			compare = getCurrencyCode().compareTo(currency.getCurrencyCode());
-		}
-		if (compare == 0) {
-			if (validFrom == null && currency.getValidFrom() != null) {
-				compare = -1;
-			} else if (validFrom != null && currency.getValidFrom() == null) {
-				compare = 1;
-			} else if (validFrom != null) {
-				compare = validFrom.compareTo(currency.getValidFrom());
-			}
-		}
-		if (compare == 0) {
-			if (validUntil == null && currency.getValidUntil() != null) {
-				compare = -1;
-			} else if (validUntil != null && currency.getValidUntil() == null) {
-				compare = 1;
-			} else if (validUntil != null) {
-				compare = validUntil.compareTo(currency.getValidUntil());
-			}
-		}
-		return compare;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	
-	public String toString() {
-		if (ISO_NAMESPACE.equals(namespace)) {
-			return currencyCode;
-		}
-		return namespace + ':' + currencyCode;
-	}
-
-	/**
-	 * Builder class that supports building complex instances of
-	 * {@link MoneyCurrency}.
-	 * 
-	 * @author Anatole Tresch
-	 */
-	public static final class Builder {
-		/** namespace for this currency. */
-		private String namespace;
-		/** currency code for this currency. */
-		private String currencyCode;
-		/** numeric code, or -1. */
-		private int numericCode = -1;
-		/** fraction digits, or -1. */
-		private int defaultFractionDigits = -1;
-		/** valid from, or {@code null}. */
-		private Long validFrom;
-		/** valid until, or {@code null}. */
-		private Long validUntil;
-		/** true, if legal tender. */
-		private boolean legalTender = true;
-		/** true for virtual currencies. */
-		private boolean virtual = false;
-
-		/**
-		 * Creates a new {@link Builder}.
-		 */
-		public Builder() {
-		}
-
-		/**
-		 * Creates a new {@link Builder}, starting with the according ISO
-		 * currency.
-		 * 
-		 * @param currencyCode
-		 *            the ISO currency code.
-		 */
-		public Builder(String currencyCode) {
-			this(ISO_NAMESPACE, currencyCode);
-		}
-
-		/**
-		 * Creates a new {@link Builder}, starting with the namespace and code
-		 * given.
-		 * 
-		 * @param namespace
-		 *            the taregt namespace
-		 * @param currencyCode
-		 *            the currency code
-		 */
-		public Builder(String namespace, String currencyCode) {
-			setNamespace(namespace);
-			setCurrencyCode(currencyCode);
-		}
-
-		/**
-		 * Set the namespace.
-		 * 
-		 * @param namespace
-		 *            the namespace, not null
-		 * @return the builder, for chaining
-		 */
-		public Builder setNamespace(String namespace) {
-			if (namespace == null) {
-				throw new IllegalArgumentException("namespace may not be null.");
-			}
-			this.namespace = namespace;
-			return this;
-		}
-
-		/**
-		 * Set the currency code.
-		 * 
-		 * @param namespace
-		 *            the currency code, not null
-		 * @return the builder, for chaining
-		 */
-		public Builder setCurrencyCode(String currencyCode) {
-			if (currencyCode == null) {
-				throw new IllegalArgumentException(
-						"currencyCode may not be null.");
-			}
-			this.currencyCode = currencyCode;
-			return this;
-		}
-
-		/**
-		 * Set the default fraction digits.
-		 * 
-		 * @param defaultFractionDigits
-		 *            the default fraction digits
-		 * @return the builder, for chaining
-		 */
-		public Builder setDefaultFractionDigits(int defaultFractionDigits) {
-			if (defaultFractionDigits < -1) {
-				throw new IllegalArgumentException(
-						"Invalid value for defaultFractionDigits: "
-								+ defaultFractionDigits);
-			}
-			this.defaultFractionDigits = defaultFractionDigits;
-			return this;
-		}
-
-		/**
-		 * Set the numeric currency code.
-		 * 
-		 * @param numericCode
-		 *            the numeric currency code
-		 * @return the builder, for chaining
-		 */
-		public Builder setNumericCode(int numericCode) {
-			if (numericCode < -1) {
-				throw new IllegalArgumentException(
-						"Invalid value for numericCode: " + numericCode);
-			}
-			this.numericCode = numericCode;
-			return this;
-		}
-
-		/**
-		 * Sets the start UTC timestamp for the currenciy's validity.
-		 * 
-		 * @param validFrom
-		 *            the start UTC timestamp
-		 * @return the builder, for chaining
-		 */
-		public Builder setValidFrom(Long validFrom) {
-			this.validFrom = validFrom;
-			return this;
-		}
-
-		/**
-		 * Sets the end UTC timestamp for the currenciy's validity.
-		 * 
-		 * @param validUntil
-		 *            the ending UTC timestamp
-		 * @return the builder, for chaining
-		 */
-		public Builder setValidUntil(Long validUntil) {
-			this.validUntil = validUntil;
-			return this;
-		}
-
-		/**
-		 * Sets the legal tender attribute.
-		 * 
-		 * @param legalTender
-		 *            true, if the currency is a legal tender
-		 * @return the builder, for chaining
-		 */
-		public Builder setLegalTender(boolean legalTender) {
-			this.legalTender = legalTender;
-			return this;
-		}
-
-		/**
-		 * Sets the virtual attribute.
-		 * 
-		 * @param virtual
-		 *            true, if the currency is a virtual currency.
-		 * @return the builder, for chaining
-		 */
-		public Builder setVirtual(boolean virtual) {
-			this.virtual = virtual;
-			return this;
-		}
-
-		/**
-		 * Get the current namespace attribute set.
-		 * 
-		 * @return the namespace value, or null.
-		 */
-		public String getNamespace() {
-			return this.namespace;
-		}
-
-		/**
-		 * Get the current currency code attribute set.
-		 * 
-		 * @return the currency code value, or null.
-		 */
-		public String getCurrencyCode() {
-			return this.currencyCode;
-		}
-
-		/**
-		 * Get the current fraction digits attribute set.
-		 * 
-		 * @return the currency fraction digits value.
-		 */
-		public int getDefaultFractionDigits() {
-			return this.defaultFractionDigits;
-		}
-
-		/**
-		 * Get the current numeric code attribute set.
-		 * 
-		 * @return the numeric code value.
-		 */
-		public int getNumericCode() {
-			return this.numericCode;
-		}
-
-		/**
-		 * Get the starting validity period timestamp.
-		 * 
-		 * @return the starting validity period tiemstamp, or null..
-		 */
-		public Long getValidFrom() {
-			return this.validFrom;
-		}
-
-		/**
-		 * Get the ending validity period timestamp.
-		 * 
-		 * @return the ending validity period tiemstamp, or null..
-		 */
-		public Long getValidUntil() {
-			return this.validUntil;
-		}
-
-		/**
-		 * Access the legal tender attribute.
-		 * 
-		 * @return the attribute value.
-		 */
-		public boolean isLegalTender() {
-			return this.legalTender;
-		}
-
-		/**
-		 * Access the virtual attribute.
-		 * 
-		 * @return the attribute value.
-		 */
-		public boolean isVirtual() {
-			return this.virtual;
-		}
-
-		/**
-		 * Checks if this {@link Builder} instance can create a
-		 * {@link MoneyCurrency}.
-		 * 
-		 * @see #build()
-		 * @return true, if the builder can build.
-		 */
-		public boolean isBuildable() {
-			return namespace != null && currencyCode != null;
-		}
-
-		/**
-		 * Builds a new currency instance, the instance build is not cached
-		 * internally.
-		 * 
-		 * @see #build(boolean)
-		 * @return a new instance of {@link MoneyCurrency}.
-		 */
-		public MoneyCurrency build() {
-			return build(true);
-		}
-
-		/**
-		 * Builds a new currency instance, which ia additinoally stored to the
-		 * internal cache for reuse.
-		 * 
-		 * @param cache
-		 *            flag to optionally store the instance created into the
-		 *            locale cache.
-		 * @return a new instance of {@link MoneyCurrency}.
-		 */
-		public MoneyCurrency build(boolean cache) {
-			if (!isBuildable()) {
-				throw new IllegalStateException(
-						"Can not build CurrencyUnitImpl.");
-			}
-			if (cache) {
-				if (validUntil != null) {
-					LOGGER.warning("CurrencyUnit build: Can only cache currencies that have no validity constraints.");
-					cache = false;
-				}
-				if (validFrom != null) {
-					if (validFrom.longValue() > System.currentTimeMillis()) {
-						LOGGER.warning("CurrencyUnit build: Can only cache currencies that are already valid.");
-						cache = false;
-					}
-				}
-			}
-			if (cache) {
-				String key = namespace + ':' + currencyCode;
-				MoneyCurrency current = CACHED.get(key);
-				if (current == null) {
-					current = new MoneyCurrency(namespace, currencyCode,
-							numericCode, defaultFractionDigits, validFrom,
-							validUntil, legalTender, virtual);
-					CACHED.put(key, current);
-				}
-				return current;
-			}
-			return new MoneyCurrency(namespace, currencyCode, numericCode,
-					defaultFractionDigits, validFrom, validUntil, legalTender,
-					virtual);
-		}
-	}
-
-	/**
-	 * Adapter that implements the new {@link CurrencyUnit} interface using the
-	 * JDK's {@link Currency}.
-	 * <p>
-	 * This adapter will be removed in the final platform implementation.
-	 * 
-	 * @author Anatole Tresch
-	 * @author Werner Keil
-	 */
-	private final static class JDKCurrencyAdapter extends MoneyCurrency
-			implements Localizable {
-
-		/**
-		 * serialVersionUID.
-		 */
-		private static final long serialVersionUID = -2523936311372374236L;
-
-		/**
-		 * ISO 4217 currency code for this currency.
-		 * 
-		 * @serial
-		 */
-		private final Currency currency;
-
-		/**
-		 * Private constructor.
-		 * 
-		 * @param currency
-		 */
-		private JDKCurrencyAdapter(Currency currency) {
-			super(currency);
-			this.currency = currency;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.lang.Object#toString()
-		 */
-		
-		public String toString() {
-			return ISO_NAMESPACE + ':' + getCurrencyCode();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see Localizable#getDisplayName(java.util.Locale)
-		 */
-		public String getDisplayName(Locale locale) {
-			//return currency.getName(locale, nameStyle, isChoiceFormat) (locale);
-			return currency.getName(ULocale.forLocale(locale), LONG_NAME, new boolean[1]);
-		}
-
-	}
-	
-	/**
-	 * Adapter that implements the new {@link CurrencyUnit} interface using the
-	 * JDK's {@link Currency}.
-	 * <p>
-	 * This adapter will be removed in the final platform implementation.
-	 * 
-	 * @author Werner Keil
-	 */
-	private final static class ICUCurrencyAdapter extends MoneyCurrency
-			implements Localizable {
-
-		/**
-		 * serialVersionUID.
-		 */
-		private static final long serialVersionUID = -2523936311372374236L;
-
-		/**
-		 * ISO 4217 currency code for this currency.
-		 * 
-		 * @serial
-		 */
-		private final com.ibm.icu.util.Currency currency;
-
-		/**
-		 * Private constructor.
-		 * 
-		 * @param currency
-		 */
-		private ICUCurrencyAdapter(com.ibm.icu.util.Currency currency) {
-			super(ISO_NAMESPACE, currency.getCurrencyCode(), -1, currency.getDefaultFractionDigits(),
-					null, null, true, false);
-			this.currency = currency;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.lang.Object#toString()
-		 */
-		
-		public String toString() {
-			return ISO_NAMESPACE + ':' + getCurrencyCode();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see javax.money.Localizable#getDisplayName(java.util.Locale)
-		 */
-		
-		public String getDisplayName(Locale locale) {
-			return currency.getName(ULocale.forLocale(locale), LONG_NAME, new boolean[1]);
-		}
-
-	}
-
-//	public String getDisplayName(Locale locale) {
-//		return getName(ULocale.forLocale(locale), LONG_NAME, new boolean[1]);
-//	}
-//
-//	public int getNumericCode() {
-//		return -1;
-//	}
-
-}
+/**
+ * Copyright (c) 2006, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.business.money;
+
+import static org.eclipse.uomo.business.money.MonetaryUnits.ISO_NAMESPACE;
+
+//import java.util.Currency;
+import java.util.Locale;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Logger;
+
+import org.eclipse.uomo.business.internal.CurrencyUnit;
+import org.eclipse.uomo.business.internal.Localizable;
+
+import com.ibm.icu.util.Currency;
+import com.ibm.icu.util.ULocale;
+
+/**
+ * Adapter that implements the  {@link CurrencyUnit} interface using the
+ * ICU4J {@link com.ibm.icu.util.Currency}.
+ * 
+ * @version 0.2.3
+ * @author Werner Keil
+ * @deprecated merge into MoneyUnit
+ */
+public class MoneyCurrency extends com.ibm.icu.util.Currency implements CurrencyUnit, Localizable {
+
+	/**
+	 * serialVersionUID.
+	 */
+	private static final long serialVersionUID = -2523936311372374236L;
+
+	/** namespace for this currency. */
+	private final String namespace;
+	/** currency code for this currency. */
+	private final String currencyCode;
+	/** valid from, or {@code null}. */
+	private final Long validFrom;
+	/** valid until, or {@code null}. */
+	private final Long validUntil;
+	/** true, if legal tender. */
+	private final boolean legalTender;
+	/** true, if it is a virtual currency. */
+	private final boolean virtual;
+
+	private static final Map<String, MoneyCurrency> CACHED = new ConcurrentHashMap<String, MoneyCurrency>();
+
+	private static final Logger LOGGER = Logger.getLogger(MoneyCurrency.class
+			.getName());
+
+	/**
+	 * Private constructor.
+	 * 
+	 * @param currency
+	 */
+	private MoneyCurrency(String namespace, String code, int numCode,
+			int fractionDigits, Long validFrom, Long validUntil, boolean legal,
+			boolean virtual) {
+		super(code);
+		this.namespace = namespace;
+		this.currencyCode = code;
+		this.validFrom = validFrom;
+		this.validUntil = validUntil;
+		this.legalTender = legal;
+		this.virtual = virtual;
+	}
+
+	/**
+	 * Private constructor.
+	 * 
+	 * @param currency
+	 */
+	private MoneyCurrency(Currency currency) {
+		super(currency != null ? currency.getCurrencyCode() : "");
+		if (currency == null) {
+			throw new IllegalArgumentException("Currency required.");
+		}
+		this.namespace = ISO_NAMESPACE;
+		this.currencyCode = currency.getCurrencyCode();
+		currency.getDefaultFractionDigits();
+		this.validFrom = null;
+		this.validUntil = null; // TODO Adapt for hisotoric one, e.g. AFA
+		this.legalTender = !this.currencyCode.startsWith("X"); // TODO check for
+																// each code in
+																// util.Currency
+																// here;
+		this.virtual = this.currencyCode.equals("XXX"); // TODO check for each
+														// code in util.Currency
+														// here;
+	}
+
+	/**
+	 * Access a new instance based on {@link Currency}.
+	 * 
+	 * @param currency
+	 *            the currency unitm not null.
+	 * @return the new instance, never null.
+	 */
+	public static MoneyCurrency of(Currency currency) {
+		String key = ISO_NAMESPACE + ':' + currency.getCurrencyCode();
+		MoneyCurrency cachedItem = CACHED.get(key);
+		if (cachedItem == null) {
+			cachedItem = new ICUCurrencyAdapter(currency);
+			CACHED.put(key, cachedItem);
+		}
+		return cachedItem;
+	}
+
+	/**
+	 * Access a new instance based on {@link Currency}.
+	 * 
+	 * @param currency
+	 *            the currency unitm not null.
+	 * @return the new instance, never null.
+	 */
+//	public static MoneyCurrency of(com.ibm.icu.util.Currency currency) {
+//		String key = ISO_NAMESPACE + ':' + currency.getCurrencyCode();
+//		MoneyCurrency cachedItem = CACHED.get(key);
+//		if (cachedItem == null) {
+//			cachedItem = new ICUCurrencyAdapter(currency);
+//			CACHED.put(key, cachedItem);
+//		}
+//		return cachedItem;
+//	}
+//	
+	/**
+	 * Access a new instance based on the ISO currency code. The code must
+	 * return a {@link Currency} when passed to
+	 * {@link Currency#getInstance(String)}.
+	 * 
+	 * @param currencyCode
+	 *            the ISO currency code, not null.
+	 * @return the corresponding {@link MonetaryCurrency} instance.
+	 */
+	public static MoneyCurrency of(String currencyCode) {
+		return of(Currency.getInstance(currencyCode));
+	}
+
+	/**
+	 * Access a new instance based on the ISO currency code. The code must
+	 * return a {@link Currency} when passed to
+	 * {@link Currency#getInstance(String)}.
+	 * 
+	 * @param namespace
+	 *            the target namespace.
+	 * @param currencyCode
+	 *            the ISO currency code, not null.
+	 * @return the corresponding {@link MonetaryCurrency} instance.
+	 */
+	public static MoneyCurrency of(String namespace, String currencyCode) {
+		String key = namespace + ':' + currencyCode;
+		MoneyCurrency cu = CACHED.get(key);
+		if (cu == null && namespace.equals(ISO_NAMESPACE)) {
+			return of(currencyCode);
+		}
+		return cu;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.money.CurrencyUnit#isVirtual()
+	 */
+	
+	public boolean isVirtual() {
+		return virtual;
+	}
+
+	/**
+	 * Get the namepsace of this {@link CurrencyUnit}, returns 'ISO-4217'.
+	 */
+	
+	public String getNamespace() {
+		return namespace;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.money.CurrencyUnit#getValidFrom()
+	 */
+	
+	public Long getValidFrom() {
+		return validFrom;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.money.CurrencyUnit#getValidUntil()
+	 */
+	
+	public Long getValidUntil() {
+		return validUntil;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.money.CurrencyUnit#getCurrencyCode()
+	 */
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.money.CurrencyUnit#getNumericCode()
+	 */
+	
+//	public int getNumericCode() {
+//		return numericCode;
+//	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.money.CurrencyUnit#getDefaultFractionDigits()
+	 */
+	
+//	public int getDefaultFractionDigits() {
+//		return defaultFractionDigits;
+//	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.money.CurrencyUnit#isLegalTender()
+	 */
+	
+	public boolean isLegalTender() {
+		return legalTender;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Comparable#compareTo(java.lang.Object)
+	 */
+	public int compareTo(CurrencyUnit currency) {
+		int compare = getNamespace().compareTo(currency.getNamespace());
+		if (compare == 0) {
+			compare = getCurrencyCode().compareTo(currency.getCurrencyCode());
+		}
+		if (compare == 0) {
+			if (validFrom == null && currency.getValidFrom() != null) {
+				compare = -1;
+			} else if (validFrom != null && currency.getValidFrom() == null) {
+				compare = 1;
+			} else if (validFrom != null) {
+				compare = validFrom.compareTo(currency.getValidFrom());
+			}
+		}
+		if (compare == 0) {
+			if (validUntil == null && currency.getValidUntil() != null) {
+				compare = -1;
+			} else if (validUntil != null && currency.getValidUntil() == null) {
+				compare = 1;
+			} else if (validUntil != null) {
+				compare = validUntil.compareTo(currency.getValidUntil());
+			}
+		}
+		return compare;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#toString()
+	 */
+	
+	public String toString() {
+		if (ISO_NAMESPACE.equals(namespace)) {
+			return currencyCode;
+		}
+		return namespace + ':' + currencyCode;
+	}
+
+	/**
+	 * Builder class that supports building complex instances of
+	 * {@link MoneyCurrency}.
+	 * 
+	 * @author Anatole Tresch
+	 */
+	public static final class Builder {
+		/** namespace for this currency. */
+		private String namespace;
+		/** currency code for this currency. */
+		private String currencyCode;
+		/** numeric code, or -1. */
+		private int numericCode = -1;
+		/** fraction digits, or -1. */
+		private int defaultFractionDigits = -1;
+		/** valid from, or {@code null}. */
+		private Long validFrom;
+		/** valid until, or {@code null}. */
+		private Long validUntil;
+		/** true, if legal tender. */
+		private boolean legalTender = true;
+		/** true for virtual currencies. */
+		private boolean virtual = false;
+
+		/**
+		 * Creates a new {@link Builder}.
+		 */
+		public Builder() {
+		}
+
+		/**
+		 * Creates a new {@link Builder}, starting with the according ISO
+		 * currency.
+		 * 
+		 * @param currencyCode
+		 *            the ISO currency code.
+		 */
+		public Builder(String currencyCode) {
+			this(ISO_NAMESPACE, currencyCode);
+		}
+
+		/**
+		 * Creates a new {@link Builder}, starting with the namespace and code
+		 * given.
+		 * 
+		 * @param namespace
+		 *            the taregt namespace
+		 * @param currencyCode
+		 *            the currency code
+		 */
+		public Builder(String namespace, String currencyCode) {
+			setNamespace(namespace);
+			setCurrencyCode(currencyCode);
+		}
+
+		/**
+		 * Set the namespace.
+		 * 
+		 * @param namespace
+		 *            the namespace, not null
+		 * @return the builder, for chaining
+		 */
+		public Builder setNamespace(String namespace) {
+			if (namespace == null) {
+				throw new IllegalArgumentException("namespace may not be null.");
+			}
+			this.namespace = namespace;
+			return this;
+		}
+
+		/**
+		 * Set the currency code.
+		 * 
+		 * @param namespace
+		 *            the currency code, not null
+		 * @return the builder, for chaining
+		 */
+		public Builder setCurrencyCode(String currencyCode) {
+			if (currencyCode == null) {
+				throw new IllegalArgumentException(
+						"currencyCode may not be null.");
+			}
+			this.currencyCode = currencyCode;
+			return this;
+		}
+
+		/**
+		 * Set the default fraction digits.
+		 * 
+		 * @param defaultFractionDigits
+		 *            the default fraction digits
+		 * @return the builder, for chaining
+		 */
+		public Builder setDefaultFractionDigits(int defaultFractionDigits) {
+			if (defaultFractionDigits < -1) {
+				throw new IllegalArgumentException(
+						"Invalid value for defaultFractionDigits: "
+								+ defaultFractionDigits);
+			}
+			this.defaultFractionDigits = defaultFractionDigits;
+			return this;
+		}
+
+		/**
+		 * Set the numeric currency code.
+		 * 
+		 * @param numericCode
+		 *            the numeric currency code
+		 * @return the builder, for chaining
+		 */
+		public Builder setNumericCode(int numericCode) {
+			if (numericCode < -1) {
+				throw new IllegalArgumentException(
+						"Invalid value for numericCode: " + numericCode);
+			}
+			this.numericCode = numericCode;
+			return this;
+		}
+
+		/**
+		 * Sets the start UTC timestamp for the currenciy's validity.
+		 * 
+		 * @param validFrom
+		 *            the start UTC timestamp
+		 * @return the builder, for chaining
+		 */
+		public Builder setValidFrom(Long validFrom) {
+			this.validFrom = validFrom;
+			return this;
+		}
+
+		/**
+		 * Sets the end UTC timestamp for the currenciy's validity.
+		 * 
+		 * @param validUntil
+		 *            the ending UTC timestamp
+		 * @return the builder, for chaining
+		 */
+		public Builder setValidUntil(Long validUntil) {
+			this.validUntil = validUntil;
+			return this;
+		}
+
+		/**
+		 * Sets the legal tender attribute.
+		 * 
+		 * @param legalTender
+		 *            true, if the currency is a legal tender
+		 * @return the builder, for chaining
+		 */
+		public Builder setLegalTender(boolean legalTender) {
+			this.legalTender = legalTender;
+			return this;
+		}
+
+		/**
+		 * Sets the virtual attribute.
+		 * 
+		 * @param virtual
+		 *            true, if the currency is a virtual currency.
+		 * @return the builder, for chaining
+		 */
+		public Builder setVirtual(boolean virtual) {
+			this.virtual = virtual;
+			return this;
+		}
+
+		/**
+		 * Get the current namespace attribute set.
+		 * 
+		 * @return the namespace value, or null.
+		 */
+		public String getNamespace() {
+			return this.namespace;
+		}
+
+		/**
+		 * Get the current currency code attribute set.
+		 * 
+		 * @return the currency code value, or null.
+		 */
+		public String getCurrencyCode() {
+			return this.currencyCode;
+		}
+
+		/**
+		 * Get the current fraction digits attribute set.
+		 * 
+		 * @return the currency fraction digits value.
+		 */
+		public int getDefaultFractionDigits() {
+			return this.defaultFractionDigits;
+		}
+
+		/**
+		 * Get the current numeric code attribute set.
+		 * 
+		 * @return the numeric code value.
+		 */
+		public int getNumericCode() {
+			return this.numericCode;
+		}
+
+		/**
+		 * Get the starting validity period timestamp.
+		 * 
+		 * @return the starting validity period tiemstamp, or null..
+		 */
+		public Long getValidFrom() {
+			return this.validFrom;
+		}
+
+		/**
+		 * Get the ending validity period timestamp.
+		 * 
+		 * @return the ending validity period tiemstamp, or null..
+		 */
+		public Long getValidUntil() {
+			return this.validUntil;
+		}
+
+		/**
+		 * Access the legal tender attribute.
+		 * 
+		 * @return the attribute value.
+		 */
+		public boolean isLegalTender() {
+			return this.legalTender;
+		}
+
+		/**
+		 * Access the virtual attribute.
+		 * 
+		 * @return the attribute value.
+		 */
+		public boolean isVirtual() {
+			return this.virtual;
+		}
+
+		/**
+		 * Checks if this {@link Builder} instance can create a
+		 * {@link MoneyCurrency}.
+		 * 
+		 * @see #build()
+		 * @return true, if the builder can build.
+		 */
+		public boolean isBuildable() {
+			return namespace != null && currencyCode != null;
+		}
+
+		/**
+		 * Builds a new currency instance, the instance build is not cached
+		 * internally.
+		 * 
+		 * @see #build(boolean)
+		 * @return a new instance of {@link MoneyCurrency}.
+		 */
+		public MoneyCurrency build() {
+			return build(true);
+		}
+
+		/**
+		 * Builds a new currency instance, which ia additinoally stored to the
+		 * internal cache for reuse.
+		 * 
+		 * @param cache
+		 *            flag to optionally store the instance created into the
+		 *            locale cache.
+		 * @return a new instance of {@link MoneyCurrency}.
+		 */
+		public MoneyCurrency build(boolean cache) {
+			if (!isBuildable()) {
+				throw new IllegalStateException(
+						"Can not build CurrencyUnitImpl.");
+			}
+			if (cache) {
+				if (validUntil != null) {
+					LOGGER.warning("CurrencyUnit build: Can only cache currencies that have no validity constraints.");
+					cache = false;
+				}
+				if (validFrom != null) {
+					if (validFrom.longValue() > System.currentTimeMillis()) {
+						LOGGER.warning("CurrencyUnit build: Can only cache currencies that are already valid.");
+						cache = false;
+					}
+				}
+			}
+			if (cache) {
+				String key = namespace + ':' + currencyCode;
+				MoneyCurrency current = CACHED.get(key);
+				if (current == null) {
+					current = new MoneyCurrency(namespace, currencyCode,
+							numericCode, defaultFractionDigits, validFrom,
+							validUntil, legalTender, virtual);
+					CACHED.put(key, current);
+				}
+				return current;
+			}
+			return new MoneyCurrency(namespace, currencyCode, numericCode,
+					defaultFractionDigits, validFrom, validUntil, legalTender,
+					virtual);
+		}
+	}
+
+	/**
+	 * Adapter that implements the new {@link CurrencyUnit} interface using the
+	 * JDK's {@link Currency}.
+	 * <p>
+	 * This adapter will be removed in the final platform implementation.
+	 * 
+	 * @author Anatole Tresch
+	 * @author Werner Keil
+	 */
+	private final static class JDKCurrencyAdapter extends MoneyCurrency
+			implements Localizable {
+
+		/**
+		 * serialVersionUID.
+		 */
+		private static final long serialVersionUID = -2523936311372374236L;
+
+		/**
+		 * ISO 4217 currency code for this currency.
+		 * 
+		 * @serial
+		 */
+		private final Currency currency;
+
+		/**
+		 * Private constructor.
+		 * 
+		 * @param currency
+		 */
+		private JDKCurrencyAdapter(Currency currency) {
+			super(currency);
+			this.currency = currency;
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see java.lang.Object#toString()
+		 */
+		
+		public String toString() {
+			return ISO_NAMESPACE + ':' + getCurrencyCode();
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see Localizable#getDisplayName(java.util.Locale)
+		 */
+		public String getDisplayName(Locale locale) {
+			//return currency.getName(locale, nameStyle, isChoiceFormat) (locale);
+			return currency.getName(ULocale.forLocale(locale), LONG_NAME, new boolean[1]);
+		}
+
+	}
+	
+	/**
+	 * Adapter that implements the new {@link CurrencyUnit} interface using the
+	 * JDK's {@link Currency}.
+	 * <p>
+	 * This adapter will be removed in the final platform implementation.
+	 * 
+	 * @author Werner Keil
+	 */
+	private final static class ICUCurrencyAdapter extends MoneyCurrency
+			implements Localizable {
+
+		/**
+		 * serialVersionUID.
+		 */
+		private static final long serialVersionUID = -2523936311372374236L;
+
+		/**
+		 * ISO 4217 currency code for this currency.
+		 * 
+		 * @serial
+		 */
+		private final com.ibm.icu.util.Currency currency;
+
+		/**
+		 * Private constructor.
+		 * 
+		 * @param currency
+		 */
+		private ICUCurrencyAdapter(com.ibm.icu.util.Currency currency) {
+			super(ISO_NAMESPACE, currency.getCurrencyCode(), -1, currency.getDefaultFractionDigits(),
+					null, null, true, false);
+			this.currency = currency;
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see java.lang.Object#toString()
+		 */
+		
+		public String toString() {
+			return ISO_NAMESPACE + ':' + getCurrencyCode();
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see javax.money.Localizable#getDisplayName(java.util.Locale)
+		 */
+		
+		public String getDisplayName(Locale locale) {
+			return currency.getName(ULocale.forLocale(locale), LONG_NAME, new boolean[1]);
+		}
+
+	}
+
+//	public String getDisplayName(Locale locale) {
+//		return getName(ULocale.forLocale(locale), LONG_NAME, new boolean[1]);
+//	}
+//
+//	public int getNumericCode() {
+//		return -1;
+//	}
+
+}
diff --git a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/money/MoneyUnit.java b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/money/MoneyUnit.java
index fbc0967..5ec9fb8 100644
--- a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/money/MoneyUnit.java
+++ b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/money/MoneyUnit.java
@@ -1,488 +1,488 @@
-/**
- * Copyright (c) 2005, 2015, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.business.money;
-
-import static org.eclipse.uomo.business.money.MonetaryUnits.ISO_NAMESPACE;
-
-import java.math.BigInteger;
-import java.util.Map;
-
-import org.eclipse.uomo.business.internal.CurrencyUnit;
-import org.eclipse.uomo.business.internal.Localizable;
-import org.eclipse.uomo.business.types.IMoney;
-import org.eclipse.uomo.core.IName;
-import org.eclipse.uomo.units.AbstractConverter;
-import org.eclipse.uomo.units.AbstractUnit;
-import org.eclipse.uomo.units.impl.AlternateUnit;
-import org.eclipse.uomo.units.impl.ProductUnit;
-import org.eclipse.uomo.units.impl.TransformedUnit;
-import org.eclipse.uomo.units.impl.converter.AddConverter;
-import org.eclipse.uomo.units.impl.converter.MultiplyConverter;
-import org.eclipse.uomo.units.impl.converter.RationalConverter;
-import org.unitsofmeasurement.quantity.Quantity;
-import org.unitsofmeasurement.unit.Dimension;
-import org.unitsofmeasurement.unit.IncommensurableException;
-import org.unitsofmeasurement.unit.UnconvertibleException;
-import org.unitsofmeasurement.unit.Unit;
-import org.unitsofmeasurement.unit.UnitConverter;
-
-import com.ibm.icu.util.Currency;
-import com.ibm.icu.util.ULocale;
-
-
-/**
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 0.2.8, $Date: 2015-04-15
- * @param <Q> the monetary quantity
- * 
- */
-public class MoneyUnit<Q extends IMoney> extends Currency implements
-		Unit<IMoney>, IName, CurrencyUnit, Localizable {
-// TODO use JSR 354
-	/**
-     * 
-     */
-	private static final long serialVersionUID = 8524573975644908457L;
-	
-	/** namespace for this currency. */
-	private final String namespace;
-	/** valid from, or {@code null}. */
-	private final Long validFrom;
-	/** valid until, or {@code null}. */
-	private final Long validUntil;
-	/** true, if legal tender. */
-	private final boolean legalTender;
-	/** true, if it is a virtual currency. */
-	private final boolean virtual;
-	
-	protected MoneyUnit(String theCode, String namespace, 
-			Long validFrom, Long validUntil,
-			boolean legalTender, boolean virtual) {
-		super(theCode);
-		this.namespace = namespace;
-		this.validFrom = validFrom;
-		this.validUntil = validUntil;
-		this.legalTender = legalTender;
-		this.virtual = virtual;
-	}
-	
-	protected MoneyUnit(String theISOCode) {
-		this(theISOCode, ISO_NAMESPACE, null, null, true, false);
-	}
-
-	/**
-	 * The Canadian Dollar currency unit.
-	 */
-	public static final MoneyUnit<IMoney> CAD = new MoneyUnit<IMoney>("CAD"); //$NON-NLS-1$
-
-	/**
-	 * The China Yan currency.
-	 */
-	public static final MoneyUnit<IMoney> CNY = new MoneyUnit<IMoney>("CNY"); //$NON-NLS-1$
-
-	/**
-	 * The Euro currency.
-	 */
-	@SuppressWarnings("rawtypes")
-	public static final MoneyUnit EUR = new MoneyUnit<IMoney>("EUR"); //$NON-NLS-1$
-
-	/**
-	 * The British Pound currency.
-	 */
-	public static final MoneyUnit<IMoney> GBP = new MoneyUnit<IMoney>("GBP"); //$NON-NLS-1$
-
-	/**
-	 * The Japanese Yen currency.
-	 */
-	public static final MoneyUnit<IMoney> JPY = new MoneyUnit<IMoney>("JPY"); //$NON-NLS-1$
-
-	/**
-	 * The Korean Republic Won currency.
-	 */
-	public static final MoneyUnit<IMoney> KRW = new MoneyUnit<IMoney>("KRW"); //$NON-NLS-1$
-
-	/**
-	 * The Taiwanese dollar currency.
-	 */
-	@SuppressWarnings("rawtypes")
-	public static final MoneyUnit TWD = new MoneyUnit<IMoney>("TWD"); //$NON-NLS-1$
-
-	/**
-	 * Holds the dimensionless unit <code>ONE</code>.
-	 */
-	public static final ProductUnit<IMoney> ONE = new ProductUnit<IMoney>();
-
-	/**
-	 * The United State dollar currency.
-	 */
-	@SuppressWarnings("rawtypes")
-	public static final MoneyUnit USD = new MoneyUnit<IMoney>("USD"); //$NON-NLS-1$
-
-	/**
-	 * Returns the result of adding an offset to this unit. The returned unit is
-	 * convertible with all units that are convertible with this unit.
-	 * 
-	 * @param offset
-	 *            the offset added (expressed in this unit, e.g.
-	 *            <code>CELSIUS = KELVIN.add(273.15)</code>).
-	 * @return <code>this.transform(new AddConverter(offset))</code>
-	 */
-	public final Unit<IMoney> add(double offset) {
-		if (offset == 0)
-			return this;
-		return transform(new AddConverter(offset));
-	}
-
-	/**
-	 * Returns a metric unit equivalent to this unscaled metric unit but used in
-	 * expressions to distinguish between quantities of a different nature but
-	 * of the same dimensions.
-	 * 
-	 * <p>
-	 * Examples of alternate units:[code] Unit<Angle> RADIAN =
-	 * ONE.alternate("rad"); Unit<Force> NEWTON =
-	 * METRE.times(KILOGRAM).divide(SECOND.pow(2)).alternate("N");
-	 * Unit<Pressure> PASCAL = NEWTON.divide(METRE.pow(2)).alternate("Pa");
-	 * [/code]
-	 * </p>
-	 * 
-	 * @param <Q>
-	 *            the type of the quantity measured by the new alternate unit.
-	 * 
-	 * @param symbol
-	 *            the new symbol for the alternate unit.
-	 * @return the alternate unit.
-	 * @throws UnsupportedOperationException
-	 *             if this unit is not an unscaled metric unit.
-	 * @throws IllegalArgumentException
-	 *             if the specified symbol is already associated to a different
-	 *             unit.
-	 */
-	@SuppressWarnings({ "unchecked", "rawtypes" })
-	public final Unit<IMoney> alternate(String symbol) {
-		return new AlternateUnit(symbol, this);
-	}
-
-	public <T extends Quantity<T>> Unit<T> asType(Class<T> type) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/**
-	 * Returns the result of dividing this unit by an approximate divisor.
-	 * 
-	 * @param divisor
-	 *            the approximate divisor.
-	 * @return <code>this.transform(new MultiplyConverter(1.0 / divisor))</code>
-	 */
-	public final Unit<IMoney> divide(double divisor) {
-		if (divisor == 1)
-			return this;
-		return transform(new MultiplyConverter(1.0 / divisor));
-	}
-
-	/**
-	 * Returns the result of dividing this unit by an exact divisor.
-	 * 
-	 * @param divisor
-	 *            the exact divisor. (e.g.
-	 *            <code>QUART = GALLON_LIQUID_US.divide(4)</code>).
-	 * @return <code>this.transform(new RationalConverter(1 , divisor))</code>
-	 */
-	public final Unit<?> divide(long divisor) {
-		if (divisor == 1)
-			return this;
-		return (Unit<?>) transform(new RationalConverter(BigInteger.ONE,
-				BigInteger.valueOf(divisor)));
-	}
-
-	public UnitConverter getConverterTo(Unit<IMoney> that)
-			throws UnconvertibleException {
-		return new MoneyConverter(this, that, 1);
-	}
-
-	public UnitConverter getConverterToAny(Unit<?> that)
-			throws IncommensurableException, UnconvertibleException {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public Dimension getDimension() {
-		return IMoney.DIMENSION;
-	}
-
-	public Map<Unit<?>, Integer> getProductUnits() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	private boolean isRationalFactor() {
-		// if (!(this instanceof TransformedUnit<?>))
-		// return false;
-		// TransformedUnit<Q> tu = (TransformedUnit<Q>) this;
-		// return tu.getParentUnit().equals(ONE) &&
-		// (tu.getConverterTo(tu.toMetric()) instanceof RationalConverter);
-		return true;
-	}
-
-	/**
-	 * Returns the inverse of this unit.
-	 * 
-	 * @return <code>1 / this</code>
-	 */
-	@SuppressWarnings({ "unchecked", "rawtypes" })
-	public final Unit<?> inverse() {
-		if (this.equals(ONE))
-			return this;
-		if (this.isRationalFactor())
-			return this.transform(this.getConverterTo((Unit) ONE).inverse());
-		return ProductUnit.getQuotientInstance(ONE, this);
-	}
-
-	public boolean isCompatible(Unit<?> that) {
-		return (this == that)
-				|| this.toMetric().equals(that.getSystemUnit())
-				|| (!"".equals(this.getDimension().toString()) && this.getDimension().equals(that.getDimension())); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the result of multiplying this unit by an exact factor.
-	 * 
-	 * @param factor
-	 *            the exact scale factor (e.g.
-	 *            <code>KILOMETRE = METRE.multiply(1000)</code>).
-	 * @return <code>this.transform(new RationalConverter(factor, 1))</code>
-	 */
-	final Unit<IMoney> multiply(long factor) {
-		if (factor == 1)
-			return this;
-		return transform(new RationalConverter(BigInteger.valueOf(factor),
-				BigInteger.ONE));
-	}
-
-	/**
-	 * Returns the result of multiplying this unit by a an approximate factor.
-	 * 
-	 * @param factor
-	 *            the approximate factor (e.g.
-	 *            <code>ELECTRON_MASS = KILOGRAM.multiply(9.10938188e-31)</code>
-	 *            ).
-	 * @return <code>this.transform(new MultiplyConverter(factor))</code>
-	 */
-	public final Unit<IMoney> multiply(double factor) {
-		if (factor == 1)
-			return this;
-		return transform(new MultiplyConverter(factor));
-	}
-
-	/**
-	 * Returns the product of this unit with the one specified.
-	 * 
-	 * @param that
-	 *            the unit multiplicand.
-	 * @return <code>this * that</code>
-	 */
-	@SuppressWarnings({ "unchecked", "rawtypes" })
-	public final Unit<?> multiply(Unit<?> that) {
-		if (this.equals(ONE))
-			return that;
-		if (that.equals(ONE))
-			return this;
-		if (this.isRationalFactor())
-			return that.transform(this.getConverterTo(ONE));
-		if (((MoneyUnit<?>) that).isRationalFactor())
-			return this.transform(that.getConverterTo((Unit) ONE));
-		return ProductUnit.getProductInstance(this, (AbstractUnit<?>) that);
-	}
-
-	/**
-	 * Returns a unit equals to this unit raised to an exponent.
-	 * 
-	 * @param n
-	 *            the exponent.
-	 * @return the result of raising this unit to the exponent.
-	 */
-	public final Unit<?> pow(int n) {
-		if (n > 0)
-			return this.multiply(this.pow(n - 1));
-		else if (n == 0)
-			return ONE;
-		else
-			// n < 0
-			return ONE.divide(this.pow(-n));
-	}
-
-	/**
-	 * Returns a unit equals to the given root of this unit.
-	 * 
-	 * @param n
-	 *            the root's order.
-	 * @return the result of taking the given root of this unit.
-	 * @throws ArithmeticException
-	 *             if <code>n == 0</code> or if this operation would result in
-	 *             an unit with a fractional exponent.
-	 */
-	public final Unit<?> root(int n) {
-		if (n > 0)
-			return ProductUnit.getRootInstance(this, n);
-		else if (n == 0)
-			throw new ArithmeticException("Root's order of zero"); //$NON-NLS-1$
-		else
-			// n < 0
-			return ONE.divide(this.root(-n));
-	}
-
-	protected Unit<IMoney> toMetric() {
-		return this;
-	}
-
-	/**
-	 * Returns the unit derived from this unit using the specified converter.
-	 * The converter does not need to be linear. For example:[code]
-	 * Unit<Dimensionless> DECIBEL = Unit.ONE.transform( new
-	 * LogConverter(10).inverse().concatenate( new RationalConverter(1, 10)));
-	 * [/code]
-	 * 
-	 * @param operation
-	 *            the converter from the transformed unit to this unit.
-	 * @return the unit after the specified transformation.
-	 */
-	@SuppressWarnings("unchecked")
-	public final Unit<IMoney> transform(UnitConverter operation) {
-		if (this instanceof Unit<?>) {
-			Unit<IMoney> tf = this;
-			Unit<?> parent = (Unit<?>) ((TransformedUnit<?>) tf)
-					.getParentUnit();
-			UnitConverter toParent = ((TransformedUnit<?>) tf).toParentUnit();
-			if (toParent == null)
-				return (Unit<IMoney>) parent;
-			UnitConverter toParentConcat = toParent.concatenate(operation);
-			if (toParentConcat == AbstractConverter.IDENTITY)
-				return (Unit<IMoney>) parent;
-			return new TransformedUnit<IMoney>((Unit<IMoney>) parent,
-					(AbstractConverter) toParentConcat);
-		}
-		if (operation == AbstractConverter.IDENTITY)
-			return this;
-		return new TransformedUnit<IMoney>(this, (AbstractConverter) operation);
-	}
-
-	/**
-	 * Returns the quotient of this unit with the one specified.
-	 * 
-	 * @param that
-	 *            the unit divisor.
-	 * @return <code>this / that</code>
-	 */
-	public final Unit<?> divide(Unit<?> that) {
-		return (Unit<?>) this.multiply(that.inverse());
-	}
-
-	public String getName() {
-		return getName(ULocale.getDefault(), LONG_NAME, new boolean[] { false });
-	}
-
-	public Unit<IMoney> getSystemUnit() {
-		return toMetric();
-	}
-	 
-	/**
-	 * Get the namespace of this {@link CurrencyUnit}, default 'ISO-4217'.
-	 */
-	public String getNamespace() {
-		return namespace;
-	}
-	 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CurrencyUnit#isLegalTender()
-	 */
-	public boolean isLegalTender() {
-		return legalTender;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CurrencyUnit#isVirtual()
-	 */
-	public boolean isVirtual() {
-		return virtual;
-	}
-	 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CurrencyUnit#getValidFrom()
-	 */
-	
-	public Long getValidFrom() {
-		return validFrom;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CurrencyUnit#getValidUntil()
-	 */
-	
-	public Long getValidUntil() {
-		return validUntil;
-	}
-
-	public int compareTo(CurrencyUnit currency) {
-		int compare = getNamespace().compareTo(currency.getNamespace());
-		if (compare == 0) {
-			compare = getCurrencyCode().compareTo(currency.getCurrencyCode());
-		}
-		if (compare == 0) {
-			if (validFrom == null && currency.getValidFrom() != null) {
-				compare = -1;
-			} else if (validFrom != null && currency.getValidFrom() == null) {
-				compare = 1;
-			} else if (validFrom != null) {
-				compare = validFrom.compareTo(currency.getValidFrom());
-			}
-		}
-		if (compare == 0) {
-			if (validUntil == null && currency.getValidUntil() != null) {
-				compare = -1;
-			} else if (validUntil != null && currency.getValidUntil() == null) {
-				compare = 1;
-			} else if (validUntil != null) {
-				compare = validUntil.compareTo(currency.getValidUntil());
-			}
-		}
-		return compare;
-	}
-	
-	/**
-	 * Access a new instance based on the ISO currency code. The code must
-	 * return a {@link Currency} when passed to
-	 * {@link Currency#getInstance(String)}.
-	 * 
-	 * @param currencyCode
-	 *            the ISO currency code, not null.
-	 * @return the corresponding {@link MonetaryCurrency} instance.
-	 */
-	public static MoneyUnit of(String currencyCode) {
-		return new MoneyUnit(currencyCode);
-	}
-
-//	public String getDisplayName(Locale locale) {
-//		return getName(ULocale.forLocale(locale), LONG_NAME, new boolean[1]);
-//	}
-//
-//	public int getNumericCode() {
-//		return -1;
-//	}
-}
+/**
+ * Copyright (c) 2005, 2015, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.business.money;
+
+import static org.eclipse.uomo.business.money.MonetaryUnits.ISO_NAMESPACE;
+
+import java.math.BigInteger;
+import java.util.Map;
+
+import org.eclipse.uomo.business.internal.CurrencyUnit;
+import org.eclipse.uomo.business.internal.Localizable;
+import org.eclipse.uomo.business.types.IMoney;
+import org.eclipse.uomo.core.IName;
+import org.eclipse.uomo.units.AbstractConverter;
+import org.eclipse.uomo.units.AbstractUnit;
+import org.eclipse.uomo.units.impl.AlternateUnit;
+import org.eclipse.uomo.units.impl.ProductUnit;
+import org.eclipse.uomo.units.impl.TransformedUnit;
+import org.eclipse.uomo.units.impl.converter.AddConverter;
+import org.eclipse.uomo.units.impl.converter.MultiplyConverter;
+import org.eclipse.uomo.units.impl.converter.RationalConverter;
+import org.unitsofmeasurement.quantity.Quantity;
+import org.unitsofmeasurement.unit.Dimension;
+import org.unitsofmeasurement.unit.IncommensurableException;
+import org.unitsofmeasurement.unit.UnconvertibleException;
+import org.unitsofmeasurement.unit.Unit;
+import org.unitsofmeasurement.unit.UnitConverter;
+
+import com.ibm.icu.util.Currency;
+import com.ibm.icu.util.ULocale;
+
+
+/**
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 0.2.8, $Date: 2015-04-15
+ * @param <Q> the monetary quantity
+ * 
+ */
+public class MoneyUnit<Q extends IMoney> extends Currency implements
+		Unit<IMoney>, IName, CurrencyUnit, Localizable {
+// TODO use JSR 354
+	/**
+     * 
+     */
+	private static final long serialVersionUID = 8524573975644908457L;
+	
+	/** namespace for this currency. */
+	private final String namespace;
+	/** valid from, or {@code null}. */
+	private final Long validFrom;
+	/** valid until, or {@code null}. */
+	private final Long validUntil;
+	/** true, if legal tender. */
+	private final boolean legalTender;
+	/** true, if it is a virtual currency. */
+	private final boolean virtual;
+	
+	protected MoneyUnit(String theCode, String namespace, 
+			Long validFrom, Long validUntil,
+			boolean legalTender, boolean virtual) {
+		super(theCode);
+		this.namespace = namespace;
+		this.validFrom = validFrom;
+		this.validUntil = validUntil;
+		this.legalTender = legalTender;
+		this.virtual = virtual;
+	}
+	
+	protected MoneyUnit(String theISOCode) {
+		this(theISOCode, ISO_NAMESPACE, null, null, true, false);
+	}
+
+	/**
+	 * The Canadian Dollar currency unit.
+	 */
+	public static final MoneyUnit<IMoney> CAD = new MoneyUnit<IMoney>("CAD"); //$NON-NLS-1$
+
+	/**
+	 * The China Yan currency.
+	 */
+	public static final MoneyUnit<IMoney> CNY = new MoneyUnit<IMoney>("CNY"); //$NON-NLS-1$
+
+	/**
+	 * The Euro currency.
+	 */
+	@SuppressWarnings("rawtypes")
+	public static final MoneyUnit EUR = new MoneyUnit<IMoney>("EUR"); //$NON-NLS-1$
+
+	/**
+	 * The British Pound currency.
+	 */
+	public static final MoneyUnit<IMoney> GBP = new MoneyUnit<IMoney>("GBP"); //$NON-NLS-1$
+
+	/**
+	 * The Japanese Yen currency.
+	 */
+	public static final MoneyUnit<IMoney> JPY = new MoneyUnit<IMoney>("JPY"); //$NON-NLS-1$
+
+	/**
+	 * The Korean Republic Won currency.
+	 */
+	public static final MoneyUnit<IMoney> KRW = new MoneyUnit<IMoney>("KRW"); //$NON-NLS-1$
+
+	/**
+	 * The Taiwanese dollar currency.
+	 */
+	@SuppressWarnings("rawtypes")
+	public static final MoneyUnit TWD = new MoneyUnit<IMoney>("TWD"); //$NON-NLS-1$
+
+	/**
+	 * Holds the dimensionless unit <code>ONE</code>.
+	 */
+	public static final ProductUnit<IMoney> ONE = new ProductUnit<IMoney>();
+
+	/**
+	 * The United State dollar currency.
+	 */
+	@SuppressWarnings("rawtypes")
+	public static final MoneyUnit USD = new MoneyUnit<IMoney>("USD"); //$NON-NLS-1$
+
+	/**
+	 * Returns the result of adding an offset to this unit. The returned unit is
+	 * convertible with all units that are convertible with this unit.
+	 * 
+	 * @param offset
+	 *            the offset added (expressed in this unit, e.g.
+	 *            <code>CELSIUS = KELVIN.add(273.15)</code>).
+	 * @return <code>this.transform(new AddConverter(offset))</code>
+	 */
+	public final Unit<IMoney> add(double offset) {
+		if (offset == 0)
+			return this;
+		return transform(new AddConverter(offset));
+	}
+
+	/**
+	 * Returns a metric unit equivalent to this unscaled metric unit but used in
+	 * expressions to distinguish between quantities of a different nature but
+	 * of the same dimensions.
+	 * 
+	 * <p>
+	 * Examples of alternate units:[code] Unit<Angle> RADIAN =
+	 * ONE.alternate("rad"); Unit<Force> NEWTON =
+	 * METRE.times(KILOGRAM).divide(SECOND.pow(2)).alternate("N");
+	 * Unit<Pressure> PASCAL = NEWTON.divide(METRE.pow(2)).alternate("Pa");
+	 * [/code]
+	 * </p>
+	 * 
+	 * @param <Q>
+	 *            the type of the quantity measured by the new alternate unit.
+	 * 
+	 * @param symbol
+	 *            the new symbol for the alternate unit.
+	 * @return the alternate unit.
+	 * @throws UnsupportedOperationException
+	 *             if this unit is not an unscaled metric unit.
+	 * @throws IllegalArgumentException
+	 *             if the specified symbol is already associated to a different
+	 *             unit.
+	 */
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	public final Unit<IMoney> alternate(String symbol) {
+		return new AlternateUnit(symbol, this);
+	}
+
+	public <T extends Quantity<T>> Unit<T> asType(Class<T> type) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	/**
+	 * Returns the result of dividing this unit by an approximate divisor.
+	 * 
+	 * @param divisor
+	 *            the approximate divisor.
+	 * @return <code>this.transform(new MultiplyConverter(1.0 / divisor))</code>
+	 */
+	public final Unit<IMoney> divide(double divisor) {
+		if (divisor == 1)
+			return this;
+		return transform(new MultiplyConverter(1.0 / divisor));
+	}
+
+	/**
+	 * Returns the result of dividing this unit by an exact divisor.
+	 * 
+	 * @param divisor
+	 *            the exact divisor. (e.g.
+	 *            <code>QUART = GALLON_LIQUID_US.divide(4)</code>).
+	 * @return <code>this.transform(new RationalConverter(1 , divisor))</code>
+	 */
+	public final Unit<?> divide(long divisor) {
+		if (divisor == 1)
+			return this;
+		return (Unit<?>) transform(new RationalConverter(BigInteger.ONE,
+				BigInteger.valueOf(divisor)));
+	}
+
+	public UnitConverter getConverterTo(Unit<IMoney> that)
+			throws UnconvertibleException {
+		return new MoneyConverter(this, that, 1);
+	}
+
+	public UnitConverter getConverterToAny(Unit<?> that)
+			throws IncommensurableException, UnconvertibleException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public Dimension getDimension() {
+		return IMoney.DIMENSION;
+	}
+
+	public Map<Unit<?>, Integer> getProductUnits() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	private boolean isRationalFactor() {
+		// if (!(this instanceof TransformedUnit<?>))
+		// return false;
+		// TransformedUnit<Q> tu = (TransformedUnit<Q>) this;
+		// return tu.getParentUnit().equals(ONE) &&
+		// (tu.getConverterTo(tu.toMetric()) instanceof RationalConverter);
+		return true;
+	}
+
+	/**
+	 * Returns the inverse of this unit.
+	 * 
+	 * @return <code>1 / this</code>
+	 */
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	public final Unit<?> inverse() {
+		if (this.equals(ONE))
+			return this;
+		if (this.isRationalFactor())
+			return this.transform(this.getConverterTo((Unit) ONE).inverse());
+		return ProductUnit.getQuotientInstance(ONE, this);
+	}
+
+	public boolean isCompatible(Unit<?> that) {
+		return (this == that)
+				|| this.toMetric().equals(that.getSystemUnit())
+				|| (!"".equals(this.getDimension().toString()) && this.getDimension().equals(that.getDimension())); //$NON-NLS-1$
+	}
+
+	/**
+	 * Returns the result of multiplying this unit by an exact factor.
+	 * 
+	 * @param factor
+	 *            the exact scale factor (e.g.
+	 *            <code>KILOMETRE = METRE.multiply(1000)</code>).
+	 * @return <code>this.transform(new RationalConverter(factor, 1))</code>
+	 */
+	final Unit<IMoney> multiply(long factor) {
+		if (factor == 1)
+			return this;
+		return transform(new RationalConverter(BigInteger.valueOf(factor),
+				BigInteger.ONE));
+	}
+
+	/**
+	 * Returns the result of multiplying this unit by a an approximate factor.
+	 * 
+	 * @param factor
+	 *            the approximate factor (e.g.
+	 *            <code>ELECTRON_MASS = KILOGRAM.multiply(9.10938188e-31)</code>
+	 *            ).
+	 * @return <code>this.transform(new MultiplyConverter(factor))</code>
+	 */
+	public final Unit<IMoney> multiply(double factor) {
+		if (factor == 1)
+			return this;
+		return transform(new MultiplyConverter(factor));
+	}
+
+	/**
+	 * Returns the product of this unit with the one specified.
+	 * 
+	 * @param that
+	 *            the unit multiplicand.
+	 * @return <code>this * that</code>
+	 */
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	public final Unit<?> multiply(Unit<?> that) {
+		if (this.equals(ONE))
+			return that;
+		if (that.equals(ONE))
+			return this;
+		if (this.isRationalFactor())
+			return that.transform(this.getConverterTo(ONE));
+		if (((MoneyUnit<?>) that).isRationalFactor())
+			return this.transform(that.getConverterTo((Unit) ONE));
+		return ProductUnit.getProductInstance(this, (AbstractUnit<?>) that);
+	}
+
+	/**
+	 * Returns a unit equals to this unit raised to an exponent.
+	 * 
+	 * @param n
+	 *            the exponent.
+	 * @return the result of raising this unit to the exponent.
+	 */
+	public final Unit<?> pow(int n) {
+		if (n > 0)
+			return this.multiply(this.pow(n - 1));
+		else if (n == 0)
+			return ONE;
+		else
+			// n < 0
+			return ONE.divide(this.pow(-n));
+	}
+
+	/**
+	 * Returns a unit equals to the given root of this unit.
+	 * 
+	 * @param n
+	 *            the root's order.
+	 * @return the result of taking the given root of this unit.
+	 * @throws ArithmeticException
+	 *             if <code>n == 0</code> or if this operation would result in
+	 *             an unit with a fractional exponent.
+	 */
+	public final Unit<?> root(int n) {
+		if (n > 0)
+			return ProductUnit.getRootInstance(this, n);
+		else if (n == 0)
+			throw new ArithmeticException("Root's order of zero"); //$NON-NLS-1$
+		else
+			// n < 0
+			return ONE.divide(this.root(-n));
+	}
+
+	protected Unit<IMoney> toMetric() {
+		return this;
+	}
+
+	/**
+	 * Returns the unit derived from this unit using the specified converter.
+	 * The converter does not need to be linear. For example:[code]
+	 * Unit<Dimensionless> DECIBEL = Unit.ONE.transform( new
+	 * LogConverter(10).inverse().concatenate( new RationalConverter(1, 10)));
+	 * [/code]
+	 * 
+	 * @param operation
+	 *            the converter from the transformed unit to this unit.
+	 * @return the unit after the specified transformation.
+	 */
+	@SuppressWarnings("unchecked")
+	public final Unit<IMoney> transform(UnitConverter operation) {
+		if (this instanceof Unit<?>) {
+			Unit<IMoney> tf = this;
+			Unit<?> parent = (Unit<?>) ((TransformedUnit<?>) tf)
+					.getParentUnit();
+			UnitConverter toParent = ((TransformedUnit<?>) tf).toParentUnit();
+			if (toParent == null)
+				return (Unit<IMoney>) parent;
+			UnitConverter toParentConcat = toParent.concatenate(operation);
+			if (toParentConcat == AbstractConverter.IDENTITY)
+				return (Unit<IMoney>) parent;
+			return new TransformedUnit<IMoney>((Unit<IMoney>) parent,
+					(AbstractConverter) toParentConcat);
+		}
+		if (operation == AbstractConverter.IDENTITY)
+			return this;
+		return new TransformedUnit<IMoney>(this, (AbstractConverter) operation);
+	}
+
+	/**
+	 * Returns the quotient of this unit with the one specified.
+	 * 
+	 * @param that
+	 *            the unit divisor.
+	 * @return <code>this / that</code>
+	 */
+	public final Unit<?> divide(Unit<?> that) {
+		return (Unit<?>) this.multiply(that.inverse());
+	}
+
+	public String getName() {
+		return getName(ULocale.getDefault(), LONG_NAME, new boolean[] { false });
+	}
+
+	public Unit<IMoney> getSystemUnit() {
+		return toMetric();
+	}
+	 
+	/**
+	 * Get the namespace of this {@link CurrencyUnit}, default 'ISO-4217'.
+	 */
+	public String getNamespace() {
+		return namespace;
+	}
+	 
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see CurrencyUnit#isLegalTender()
+	 */
+	public boolean isLegalTender() {
+		return legalTender;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see CurrencyUnit#isVirtual()
+	 */
+	public boolean isVirtual() {
+		return virtual;
+	}
+	 
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see CurrencyUnit#getValidFrom()
+	 */
+	
+	public Long getValidFrom() {
+		return validFrom;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see CurrencyUnit#getValidUntil()
+	 */
+	
+	public Long getValidUntil() {
+		return validUntil;
+	}
+
+	public int compareTo(CurrencyUnit currency) {
+		int compare = getNamespace().compareTo(currency.getNamespace());
+		if (compare == 0) {
+			compare = getCurrencyCode().compareTo(currency.getCurrencyCode());
+		}
+		if (compare == 0) {
+			if (validFrom == null && currency.getValidFrom() != null) {
+				compare = -1;
+			} else if (validFrom != null && currency.getValidFrom() == null) {
+				compare = 1;
+			} else if (validFrom != null) {
+				compare = validFrom.compareTo(currency.getValidFrom());
+			}
+		}
+		if (compare == 0) {
+			if (validUntil == null && currency.getValidUntil() != null) {
+				compare = -1;
+			} else if (validUntil != null && currency.getValidUntil() == null) {
+				compare = 1;
+			} else if (validUntil != null) {
+				compare = validUntil.compareTo(currency.getValidUntil());
+			}
+		}
+		return compare;
+	}
+	
+	/**
+	 * Access a new instance based on the ISO currency code. The code must
+	 * return a {@link Currency} when passed to
+	 * {@link Currency#getInstance(String)}.
+	 * 
+	 * @param currencyCode
+	 *            the ISO currency code, not null.
+	 * @return the corresponding {@link MonetaryCurrency} instance.
+	 */
+	public static MoneyUnit of(String currencyCode) {
+		return new MoneyUnit(currencyCode);
+	}
+
+//	public String getDisplayName(Locale locale) {
+//		return getName(ULocale.forLocale(locale), LONG_NAME, new boolean[1]);
+//	}
+//
+//	public int getNumericCode() {
+//		return -1;
+//	}
+}
diff --git a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/BDTypeException.java b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/BDTypeException.java
index dafd4d2..e26e439 100644
--- a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/BDTypeException.java
+++ b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/BDTypeException.java
@@ -1,30 +1,30 @@
-/**
- * Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.business.types;
-
-import org.eclipse.uomo.core.UOMoRuntimeException;
-
-
-/**
- * Basic Data Type Exception class
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @deprecated Try using UOMoRuntimeException directly
- */
-public class BDTypeException extends UOMoRuntimeException  {
-	final static long serialVersionUID = 362498820763181265L;
-/**
- * BDTypeException constructor with String.
- */
-public BDTypeException(String s)  {
-	super(s);
-	
-}
-}
+/**
+ * Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.business.types;
+
+import org.eclipse.uomo.core.UOMoRuntimeException;
+
+
+/**
+ * Basic Data Type Exception class
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @deprecated Try using UOMoRuntimeException directly
+ */
+public class BDTypeException extends UOMoRuntimeException  {
+	final static long serialVersionUID = 362498820763181265L;
+/**
+ * BDTypeException constructor with String.
+ */
+public BDTypeException(String s)  {
+	super(s);
+	
+}
+}
diff --git a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/IBasicType.java b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/IBasicType.java
index 97a1fe6..02d019b 100644
--- a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/IBasicType.java
+++ b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/IBasicType.java
@@ -1,16 +1,16 @@
-package org.eclipse.uomo.business.types;
-
-/**
- * This interface indicates that a class is a Basic Data Type
- * 
- * @author Werner Keil
- */
-public interface IBasicType {
-	
-	/**
-	 * This requires that all Basic Data Types implement a serialize method
-	 * 
-	 * @return java.lang.String
-	 */
-	String serialize();	
-}
+package org.eclipse.uomo.business.types;
+
+/**
+ * This interface indicates that a class is a Basic Data Type
+ * 
+ * @author Werner Keil
+ */
+public interface IBasicType {
+	
+	/**
+	 * This requires that all Basic Data Types implement a serialize method
+	 * 
+	 * @return java.lang.String
+	 */
+	String serialize();	
+}
diff --git a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/IMarket.java b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/IMarket.java
index 0c8cd78..365feae 100644
--- a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/IMarket.java
+++ b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/IMarket.java
@@ -1,92 +1,92 @@
-package org.eclipse.uomo.business.types;
-
-import java.util.*;
-
-import org.eclipse.uomo.core.IName;
-import org.eclipse.uomo.core.ISymbol;
-import org.unitsofmeasurement.quantity.Time;
-import org.unitsofmeasurement.unit.Unit;
-
-import com.ibm.icu.util.Holiday;
-
-/**
- * Insert the type's description here. Creation date: (9/20/00 2:35:47 PM)
- * @version $Revision$, Change date: ($Date$)
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- */
-public interface IMarket extends IBDType, IName, ISymbol {
-	/**
-	 * Insert the method's description here. Creation date: (9/26/00 4:55:31 PM)
-	 * 
-	 * @return java.util.HashMap
-	 */
-	Map<Date, Holiday> getHolidays();
-
-	/**
-	 * Insert the method's description here. Creation date: (9/28/00 9:43:08 AM)
-	 * 
-	 * @return java.util.HashMap
-	 */
-	Map<Date, Holiday> getReplHolidays();
-
-	/**
-	 * Insert the method's description here. Creation date: (9/25/00 10:25:18
-	 * AM)
-	 * 
-	 * @return java.util.HashMap
-	 */
-	Map<String, List<Time>> getTimes();
-
-	/**
-	 * Insert the method's description here. Creation date: (9/25/00 4:36:09 PM)
-	 * 
-	 * @return java.lang.String
-	 */
-	String getTimeZone();
-
-	/**
-	 * Returns true if market is open for specified date and FI Type
-	 * 
-	 * @return boolean
-	 */
-	public boolean isOpen(Date date, String fiType);
-
-	/**
-	 * Returns true if market is open for specified time and FI Type
-	 * 
-	 * @return boolean
-	 */
-	public boolean isOpen(Unit<Time> ts, String fiType);
-
-	/**
-	 * Returns true if market is open right now for specified FIType
-	 * 
-	 * @return boolean
-	 */
-	public boolean isOpen(String fiType);
-
-	/**
-	 * Insert the method's description here. Creation date: (9/26/00 4:52:54 PM)
-	 * 
-	 * @param hm
-	 *            java.util.HashMap
-	 */
-	void setHolidays(Map<Date, Holiday> hm);
-
-	/**
-	 * Insert the method's description here. Creation date: (9/26/00 4:52:54 PM)
-	 * 
-	 * @param hm
-	 *            java.util.HashMap
-	 */
-	void setReplHolidays(Map<Date, Holiday> hm);
-
-	/**
-	 * Insert the method's description here. Creation date: (9/25/00 10:25:57
-	 * AM)
-	 * 
-	 * @param hm
-	 *            java.util.HashMap
-	 */
-	void setTimes(Map<String, List<Time>> hm);
-}
+package org.eclipse.uomo.business.types;
+
+import java.util.*;
+
+import org.eclipse.uomo.core.IName;
+import org.eclipse.uomo.core.ISymbol;
+import org.unitsofmeasurement.quantity.Time;
+import org.unitsofmeasurement.unit.Unit;
+
+import com.ibm.icu.util.Holiday;
+
+/**
+ * Insert the type's description here. Creation date: (9/20/00 2:35:47 PM)
+ * @version $Revision$, Change date: ($Date$)
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ */
+public interface IMarket extends IBDType, IName, ISymbol {
+	/**
+	 * Insert the method's description here. Creation date: (9/26/00 4:55:31 PM)
+	 * 
+	 * @return java.util.HashMap
+	 */
+	Map<Date, Holiday> getHolidays();
+
+	/**
+	 * Insert the method's description here. Creation date: (9/28/00 9:43:08 AM)
+	 * 
+	 * @return java.util.HashMap
+	 */
+	Map<Date, Holiday> getReplHolidays();
+
+	/**
+	 * Insert the method's description here. Creation date: (9/25/00 10:25:18
+	 * AM)
+	 * 
+	 * @return java.util.HashMap
+	 */
+	Map<String, List<Time>> getTimes();
+
+	/**
+	 * Insert the method's description here. Creation date: (9/25/00 4:36:09 PM)
+	 * 
+	 * @return java.lang.String
+	 */
+	String getTimeZone();
+
+	/**
+	 * Returns true if market is open for specified date and FI Type
+	 * 
+	 * @return boolean
+	 */
+	public boolean isOpen(Date date, String fiType);
+
+	/**
+	 * Returns true if market is open for specified time and FI Type
+	 * 
+	 * @return boolean
+	 */
+	public boolean isOpen(Unit<Time> ts, String fiType);
+
+	/**
+	 * Returns true if market is open right now for specified FIType
+	 * 
+	 * @return boolean
+	 */
+	public boolean isOpen(String fiType);
+
+	/**
+	 * Insert the method's description here. Creation date: (9/26/00 4:52:54 PM)
+	 * 
+	 * @param hm
+	 *            java.util.HashMap
+	 */
+	void setHolidays(Map<Date, Holiday> hm);
+
+	/**
+	 * Insert the method's description here. Creation date: (9/26/00 4:52:54 PM)
+	 * 
+	 * @param hm
+	 *            java.util.HashMap
+	 */
+	void setReplHolidays(Map<Date, Holiday> hm);
+
+	/**
+	 * Insert the method's description here. Creation date: (9/25/00 10:25:57
+	 * AM)
+	 * 
+	 * @param hm
+	 *            java.util.HashMap
+	 */
+	void setTimes(Map<String, List<Time>> hm);
+}
diff --git a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/IMoney.java b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/IMoney.java
index 7f5228c..2a43dcf 100644
--- a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/IMoney.java
+++ b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/IMoney.java
@@ -1,33 +1,33 @@
-/**
- * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
- */
-package org.eclipse.uomo.business.types;
-
-import static org.eclipse.uomo.business.money.MoneyAmount.UNIT;
-
-import org.eclipse.uomo.units.IMeasure;
-import org.unitsofmeasurement.unit.Dimension;
-
-/**
- * This interface represents something generally accepted as a medium of
- * exchange, a measure of value, or a means of payment. The units for money
- * quantities is of type {@link Currency}.
- * 
- * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 3.2 ($Revision: 227 $), $Date: 2010-10-01 00:54:55 +0200 (Fr, 01 Okt 2010) $
- */
-public interface IMoney extends IBDType, IMeasure<IMoney> {
-
-    /**
-     * Holds the dimension for money quantities (dimension [$]).
-     */
-    public static final Dimension DIMENSION = UNIT.getDimension();
-}
+/**
+ * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
+ */
+package org.eclipse.uomo.business.types;
+
+import static org.eclipse.uomo.business.money.MoneyAmount.UNIT;
+
+import org.eclipse.uomo.units.IMeasure;
+import org.unitsofmeasurement.unit.Dimension;
+
+/**
+ * This interface represents something generally accepted as a medium of
+ * exchange, a measure of value, or a means of payment. The units for money
+ * quantities is of type {@link Currency}.
+ * 
+ * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 3.2 ($Revision: 227 $), $Date: 2010-10-01 00:54:55 +0200 (Fr, 01 Okt 2010) $
+ */
+public interface IMoney extends IBDType, IMeasure<IMoney> {
+
+    /**
+     * Holds the dimension for money quantities (dimension [$]).
+     */
+    public static final Dimension DIMENSION = UNIT.getDimension();
+}
diff --git a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/impl/BDate.java b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/impl/BDate.java
index 50a0add..b7ec213 100644
--- a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/impl/BDate.java
+++ b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/impl/BDate.java
@@ -1,148 +1,148 @@
-package org.eclipse.uomo.business.types.impl;
-
-import static org.eclipse.uomo.business.types.impl.DataHelper.BDT_DELIM;
-
-import java.util.Calendar;
-import java.util.GregorianCalendar;
-
-import org.eclipse.uomo.business.types.IBasicType;
-import org.eclipse.uomo.core.UOMoRuntimeException;
-
-/**
- * Define (non-Java.util) Date class
- * 
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- */
-public class BDate implements IBasicType {
-	String m_date;
-
-	/**
-	 * Constructor for date with no parameter - use current date in this locale
-	 * - dangerous!
-	 */
-
-	public BDate() {
-
-		Calendar cal = new GregorianCalendar();
-
-		java.util.Date date = cal.getTime();
-
-		TimeStamp ts = new TimeStamp(date.getTime());
-		m_date = ts.serialize().substring(0, 8);
-
-	}
-
-	/**
-	 * Constructor for date with date string (yyyymmdd); optional calendar and
-	 * era are being ignored for now
-	 */
-
-	public BDate(String s) {
-		super();
-		m_date = BuildDate(s);
-	}
-
-	/**
-	 * Constructor for jbdtypes Date using java.sql.Date
-	 */
-
-	public BDate(java.sql.Date dt) {
-		long millis = dt.getTime();
-		TimeStamp ts = new TimeStamp(millis);
-
-		m_date = BuildDate(ts.serialize().substring(0, 8));
-	}
-
-	/**
-	 * Return true if <code>this</code> date is after specified date
-	 * 
-	 * @return boolean
-	 * @param d
-	 *            com.jpmorrsn.jbdtypes.Date
-	 */
-	public boolean after(BDate d) {
-		return Integer.parseInt(this.m_date) > Integer.parseInt(d.m_date);
-	}
-
-	/**
-	 * Return true if <code>this</code> date is before specified date
-	 * 
-	 * @return boolean
-	 * @param d
-	 *            com.jpmorrsn.jbdtypes.Date
-	 */
-	public boolean before(BDate d) {
-		return Integer.parseInt(this.m_date) < Integer.parseInt(d.m_date);
-	}
-
-	/**
-	 * Strip off calendar and era (if any)
-	 * 
-	 * @return java.lang.String
-	 * @param s
-	 *            java.lang.String
-	 */
-	static String BuildDate(String s) {
-		int sp = s.indexOf(BDT_DELIM);
-		if (sp == -1)
-			return s;
-		else
-			return s.substring(0, sp);
-	}
-
-	/**
-	 * Build a TimeStamp using specified TimeTz object
-	 * 
-	 * @return com.jpmorrsn.jbdtypes.TimeStamp
-	 * @param t
-	 *            com.jpmorrsn.jbdtypes.TimeTz
-	 * @throws BDTypeException
-	 */
-	public TimeStamp buildTimeStamp(TimeTz t) throws UOMoRuntimeException {
-
-		return new TimeStamp(m_date + 'T' + t.serialize());
-	}
-
-	/**
-	 * Convert this Date to a java.sql.Date
-	 * 
-	 * @return java.sql.Timestamp
-	 */
-	public java.sql.Date convertToSQL() {
-
-		TimeStamp ts = new TimeStamp(m_date + "T00:00");
-		return new java.sql.Date(ts.getTime());
-
-	}
-
-	/**
-	 * Return true if <code>this</code> date is same as specified date
-	 * 
-	 * @return boolean
-	 * @param d
-	 *            com.jpmorrsn.jbdtypes.Date
-	 */
-	public boolean equals(BDate d) {
-		return Integer.parseInt(this.m_date) == Integer.parseInt(d.m_date);
-	}
-
-	/**
-	 * Display a (non-Java.util) jbdtypes Date object as an 8-byte string
-	 * 
-	 * @return java.lang.String
-	 */
-	public String serialize() {
-
-		return m_date;
-
-	}
-
-	/**
-	 * Create a String from this object
-	 * 
-	 * @return java.lang.String
-	 */
-	public String toString() {
-		return serialize();
-	}
-}
+package org.eclipse.uomo.business.types.impl;
+
+import static org.eclipse.uomo.business.types.impl.DataHelper.BDT_DELIM;
+
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+
+import org.eclipse.uomo.business.types.IBasicType;
+import org.eclipse.uomo.core.UOMoRuntimeException;
+
+/**
+ * Define (non-Java.util) Date class
+ * 
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ */
+public class BDate implements IBasicType {
+	String m_date;
+
+	/**
+	 * Constructor for date with no parameter - use current date in this locale
+	 * - dangerous!
+	 */
+
+	public BDate() {
+
+		Calendar cal = new GregorianCalendar();
+
+		java.util.Date date = cal.getTime();
+
+		TimeStamp ts = new TimeStamp(date.getTime());
+		m_date = ts.serialize().substring(0, 8);
+
+	}
+
+	/**
+	 * Constructor for date with date string (yyyymmdd); optional calendar and
+	 * era are being ignored for now
+	 */
+
+	public BDate(String s) {
+		super();
+		m_date = BuildDate(s);
+	}
+
+	/**
+	 * Constructor for jbdtypes Date using java.sql.Date
+	 */
+
+	public BDate(java.sql.Date dt) {
+		long millis = dt.getTime();
+		TimeStamp ts = new TimeStamp(millis);
+
+		m_date = BuildDate(ts.serialize().substring(0, 8));
+	}
+
+	/**
+	 * Return true if <code>this</code> date is after specified date
+	 * 
+	 * @return boolean
+	 * @param d
+	 *            com.jpmorrsn.jbdtypes.Date
+	 */
+	public boolean after(BDate d) {
+		return Integer.parseInt(this.m_date) > Integer.parseInt(d.m_date);
+	}
+
+	/**
+	 * Return true if <code>this</code> date is before specified date
+	 * 
+	 * @return boolean
+	 * @param d
+	 *            com.jpmorrsn.jbdtypes.Date
+	 */
+	public boolean before(BDate d) {
+		return Integer.parseInt(this.m_date) < Integer.parseInt(d.m_date);
+	}
+
+	/**
+	 * Strip off calendar and era (if any)
+	 * 
+	 * @return java.lang.String
+	 * @param s
+	 *            java.lang.String
+	 */
+	static String BuildDate(String s) {
+		int sp = s.indexOf(BDT_DELIM);
+		if (sp == -1)
+			return s;
+		else
+			return s.substring(0, sp);
+	}
+
+	/**
+	 * Build a TimeStamp using specified TimeTz object
+	 * 
+	 * @return com.jpmorrsn.jbdtypes.TimeStamp
+	 * @param t
+	 *            com.jpmorrsn.jbdtypes.TimeTz
+	 * @throws BDTypeException
+	 */
+	public TimeStamp buildTimeStamp(TimeTz t) throws UOMoRuntimeException {
+
+		return new TimeStamp(m_date + 'T' + t.serialize());
+	}
+
+	/**
+	 * Convert this Date to a java.sql.Date
+	 * 
+	 * @return java.sql.Timestamp
+	 */
+	public java.sql.Date convertToSQL() {
+
+		TimeStamp ts = new TimeStamp(m_date + "T00:00");
+		return new java.sql.Date(ts.getTime());
+
+	}
+
+	/**
+	 * Return true if <code>this</code> date is same as specified date
+	 * 
+	 * @return boolean
+	 * @param d
+	 *            com.jpmorrsn.jbdtypes.Date
+	 */
+	public boolean equals(BDate d) {
+		return Integer.parseInt(this.m_date) == Integer.parseInt(d.m_date);
+	}
+
+	/**
+	 * Display a (non-Java.util) jbdtypes Date object as an 8-byte string
+	 * 
+	 * @return java.lang.String
+	 */
+	public String serialize() {
+
+		return m_date;
+
+	}
+
+	/**
+	 * Create a String from this object
+	 * 
+	 * @return java.lang.String
+	 */
+	public String toString() {
+		return serialize();
+	}
+}
diff --git a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/impl/Market.java b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/impl/Market.java
index 709cabc..969843e 100644
--- a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/impl/Market.java
+++ b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/impl/Market.java
@@ -1,323 +1,323 @@
-/**
- * Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.business.types.impl;
-
-import java.util.*;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.uomo.business.internal.Messages;
-import org.eclipse.uomo.business.types.BDTHelper;
-import org.eclipse.uomo.business.types.BDTypeException;
-import org.eclipse.uomo.business.types.IMarket;
-import org.unitsofmeasurement.quantity.Time;
-import org.unitsofmeasurement.unit.Unit;
-
-import com.ibm.icu.util.Holiday;
-
-/**
- * Market object - object is mutable, but only the holiday table for a market
- * will be changed on a regular basis (plus the closed indicators); open and
- * close times will only be changed at BDT Load time.
- * 
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 0.4 ($Revision$), $Date$
- */
-public class Market {
-	static class MarketImpl implements IMarket {
-
-		/**
-		 * Returns true if market is open for specified FIType
-		 * 
-		 * @return boolean
-		 */
-		String m_name;
-		String m_symbol;
-		String m_code = null; // this must be the Reuters code
-
-		String m_timeZone = null; // alpha TimeZone ID - can be used by
-									// TimeStamp methods)
-		String m_openTime = "09:30"; // default values //$NON-NLS-1$
-		String m_closeTime = "16:00"; //     same //$NON-NLS-1$
-		String m_countryCode = null;
-		String m_quoteCurrency = null;
-		Map<String, List<Time>> m_times = null; // HashMap of open and close times
-												// - key is fiType
-
-		Map<Date, Holiday> m_holidays = null; // list of holidays - keyed on date
-		Map<Date, Holiday> m_replHolidays = new HashMap<Date, Holiday>(); // used to build new holiday
-												// list
-		// TODO introdude ICU4J Holiday type and related framework
-		
-		/**
-		 * Returns true if market is open right now for specified FIType
-		 * 
-		 * @return boolean
-		 */
-
-		public boolean isOpen(String fiType) {
-
-			// TimeStamp ts = new TimeStamp(); // set timestamp to right now!
-			// return isOpen(ts, fiType);
-
-			return false;
-
-		}
-
-		/**
-		 * Returns true if market is open at specified time and for specified
-		 * FIType
-		 * 
-		 * @return boolean
-		 */
-
-		public boolean isOpen(Unit<Time> ts, String fiType) {
-
-			if (m_code.equals("M")) { //$NON-NLS-1$
-				System.err
-						.println("Montreal Exchange forced closed for testing!"); //$NON-NLS-1$
-				System.err.println("Remember to correct code later!"); //$NON-NLS-1$
-				return false;
-			}
-
-			String open = m_openTime;
-			String close = m_closeTime;
-			boolean closeInd = false;
-			if (m_times != null) {
-				List list = (List) m_times.get(fiType);
-				closeInd = list.get(0).equals("1"); //$NON-NLS-1$
-				open = (String) list.get(1);
-				close = (String) list.get(2);
-			}
-
-			if (closeInd)
-				return false;
-
-			// try {String nowInTZ = ts.formatWithZone(m_timeZone); // now in
-			// market time zone
-			//
-			// TimeZone tz = TimeTz.GetTimeZone(m_timeZone); // get from
-			// BDTHelper table
-			// String date = nowInTZ.substring(0,8);
-			//
-			// Calendar cal = new GregorianCalendar(tz); // needed to obtain day
-			// of week
-			// cal.setTime(ts);
-			// int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
-			// HashMap hm = getHolidays();
-			// if (dayOfWeek == Calendar.SATURDAY || dayOfWeek ==
-			// Calendar.SUNDAY ||
-			// hm != null && null != hm.get(date)) // or is date in list of
-			// holidays?
-			// return false;
-			//
-			//
-			// TimeStamp tsStart = new TimeStamp(date + 'T' + open + '!' +
-			// m_timeZone);
-			// TimeStamp tsEnd = new TimeStamp(date + 'T' + close + '!' +
-			// m_timeZone);
-			//
-			// if (ts.before(tsStart) || ts.after(tsEnd))
-			// return false;
-			//
-			// }
-			// catch (BDTypeException ex) {
-			// System.err.println("Date error: " + ex);
-			// }
-			//
-			return true;
-
-		}
-
-		/**
-		 * Returns true if market is open for specified Date and FI Type
-		 * (partial dates will be treated as not open); times will not be
-		 * checked at all
-		 * 
-		 * @return boolean
-		 */
-		public boolean isOpen(Date date, String fiType) {
-
-			if (m_code.equals("M")) { //$NON-NLS-1$
-				System.err
-						.println("Montreal Exchange forced closed for testing!"); //$NON-NLS-1$
-				System.err.println("Remember to correct code later!"); //$NON-NLS-1$
-				return false;
-			}
-
-			boolean closeInd = false;
-			if (m_times != null) {
-				List list = (List) m_times.get(fiType);
-				closeInd = list.get(0).equals("1"); //$NON-NLS-1$
-			}
-
-			if (closeInd)
-				return false;
-
-			// try {TimeStamp timeWithinDate = new TimeStamp(date + "T12:00!" +
-			// m_timeZone);
-			//
-			// TimeZone tz = TimeTz.GetTimeZone(m_timeZone); // get from
-			// BDTHelper table
-			// Calendar cal = new GregorianCalendar(tz); // needed to obtain day
-			// of week
-			// cal.setTime(timeWithinDate);
-			// int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
-			// HashMap hm = getHolidays();
-			// if (dayOfWeek == Calendar.SATURDAY || dayOfWeek ==
-			// Calendar.SUNDAY ||
-			// hm != null && null != hm.get(date)) // or is date in list of
-			// holidays?
-			// return false;
-			//
-			//
-			// }
-			// catch (BDTypeException ex) {
-			// System.err.println("Date error: " + ex);
-			// }
-
-			return true;
-
-		}
-
-		/**
-		 * Get HashMap of open/close times
-		 */
-
-		public Map<String, List<Time>> getTimes() {
-			return m_times;
-		}
-
-		/**
-		 * Set HashMap with open/close times
-		 */
-
-		public void setTimes(HashMap<String, List<Time>> hm) {
-			m_times = hm;
-		}
-
-		/**
-		 * Insert the method's description here. Creation date: (9/20/00 2:49:20
-		 * PM)
-		 * 
-		 * @return java.lang.String
-		 */
-		public String serialize() {
-
-			String str = m_code + ';' + m_timeZone + ';' + m_countryCode + ';'
-					+ m_quoteCurrency + ';' + '{';
-			Iterator iter = m_times.keySet().iterator();
-			boolean first = true;
-			while (iter.hasNext()) {
-				if (!first)
-					str = str + ';';
-				first = false;
-				String key = (String) iter.next();
-				List vec = (List) m_times.get(key);
-				str = str
-						+ key
-						+ "={" + vec.get(0) + ';' + vec.get(1) + ';' + vec.get(2) + '}'; //$NON-NLS-1$
-			}
-			str = str + "}{"; //$NON-NLS-1$
-
-			iter = m_holidays.keySet().iterator();
-			first = true;
-			while (iter.hasNext()) {
-				if (!first)
-					str = str + ';';
-				first = false;
-				Date d = (Date) iter.next();
-				str = str + d.toString();
-			}
-			str = str + '}';
-			return str;
-
-		}
-
-		MarketImpl(String s1, String s2, String s3, String s4) {
-			m_code = s1;
-			m_timeZone = s2;
-			m_countryCode = s3;
-			m_quoteCurrency = s4;
-		}
-
-		public String getTimeZone() {
-			return m_timeZone;
-		}
-
-		public synchronized Map<Date, Holiday> getHolidays() {
-			return m_holidays;
-		}
-
-		public synchronized void setHolidays(Map<Date, Holiday> hm) {
-			m_holidays = hm;
-		}
-
-		public Map<Date, Holiday> getReplHolidays() {
-			return m_replHolidays;
-		}
-
-		public void setReplHolidays(Map<Date, Holiday> hm) {
-			m_replHolidays = hm;
-		}
-
-		public void setTimes(Map<String, List<Time>> hm) {
-			m_times = hm;
-		}
-
-		public String getName() {
-			return m_name;
-		}
-
-		public String getSymbol() {
-			return m_symbol;
-		}
-
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (9/22/00 4:09:05 PM)
-	 * 
-	 * @return com.jpmorrsn.jbdtypes.IMarket
-	 * @param s1
-	 *            java.lang.String
-	 * @param s2
-	 *            java.lang.String
-	 * @param s3
-	 *            java.lang.String
-	 * @param s4
-	 *            java.lang.String
-	 */
-	static IMarket createMarket(String s1, String s2, String s3, String s4) {
-		return new MarketImpl(s1, s2, s3, s4);
-	}
-
-	/**
-	 * Return an IMarket object given the name - return null if string empty
-	 * 
-	 * @return org.eclipse.uomo.business.types.IMarket
-	 * @param s
-	 *            java.lang.String
-	 */
-	public static IMarket get(String s) throws BDTypeException {
-
-		if (s.equals("")) //$NON-NLS-1$
-			return null;
-		else {
-			IMarket mkt = BDTHelper.getMarkets().get(s);
-			if (mkt == null) {
-				// System.err.println("Invalid market code: " + s);
-				throw new BDTypeException(NLS.bind(
-						Messages.Market_invalid_code, s)); //$NON-NLS-1$
-			}
-			return mkt;
-		}
-	}
-}
+/**
+ * Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.business.types.impl;
+
+import java.util.*;
+
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.uomo.business.internal.Messages;
+import org.eclipse.uomo.business.types.BDTHelper;
+import org.eclipse.uomo.business.types.BDTypeException;
+import org.eclipse.uomo.business.types.IMarket;
+import org.unitsofmeasurement.quantity.Time;
+import org.unitsofmeasurement.unit.Unit;
+
+import com.ibm.icu.util.Holiday;
+
+/**
+ * Market object - object is mutable, but only the holiday table for a market
+ * will be changed on a regular basis (plus the closed indicators); open and
+ * close times will only be changed at BDT Load time.
+ * 
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 0.4 ($Revision$), $Date$
+ */
+public class Market {
+	static class MarketImpl implements IMarket {
+
+		/**
+		 * Returns true if market is open for specified FIType
+		 * 
+		 * @return boolean
+		 */
+		String m_name;
+		String m_symbol;
+		String m_code = null; // this must be the Reuters code
+
+		String m_timeZone = null; // alpha TimeZone ID - can be used by
+									// TimeStamp methods)
+		String m_openTime = "09:30"; // default values //$NON-NLS-1$
+		String m_closeTime = "16:00"; //     same //$NON-NLS-1$
+		String m_countryCode = null;
+		String m_quoteCurrency = null;
+		Map<String, List<Time>> m_times = null; // HashMap of open and close times
+												// - key is fiType
+
+		Map<Date, Holiday> m_holidays = null; // list of holidays - keyed on date
+		Map<Date, Holiday> m_replHolidays = new HashMap<Date, Holiday>(); // used to build new holiday
+												// list
+		// TODO introdude ICU4J Holiday type and related framework
+		
+		/**
+		 * Returns true if market is open right now for specified FIType
+		 * 
+		 * @return boolean
+		 */
+
+		public boolean isOpen(String fiType) {
+
+			// TimeStamp ts = new TimeStamp(); // set timestamp to right now!
+			// return isOpen(ts, fiType);
+
+			return false;
+
+		}
+
+		/**
+		 * Returns true if market is open at specified time and for specified
+		 * FIType
+		 * 
+		 * @return boolean
+		 */
+
+		public boolean isOpen(Unit<Time> ts, String fiType) {
+
+			if (m_code.equals("M")) { //$NON-NLS-1$
+				System.err
+						.println("Montreal Exchange forced closed for testing!"); //$NON-NLS-1$
+				System.err.println("Remember to correct code later!"); //$NON-NLS-1$
+				return false;
+			}
+
+			String open = m_openTime;
+			String close = m_closeTime;
+			boolean closeInd = false;
+			if (m_times != null) {
+				List list = (List) m_times.get(fiType);
+				closeInd = list.get(0).equals("1"); //$NON-NLS-1$
+				open = (String) list.get(1);
+				close = (String) list.get(2);
+			}
+
+			if (closeInd)
+				return false;
+
+			// try {String nowInTZ = ts.formatWithZone(m_timeZone); // now in
+			// market time zone
+			//
+			// TimeZone tz = TimeTz.GetTimeZone(m_timeZone); // get from
+			// BDTHelper table
+			// String date = nowInTZ.substring(0,8);
+			//
+			// Calendar cal = new GregorianCalendar(tz); // needed to obtain day
+			// of week
+			// cal.setTime(ts);
+			// int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
+			// HashMap hm = getHolidays();
+			// if (dayOfWeek == Calendar.SATURDAY || dayOfWeek ==
+			// Calendar.SUNDAY ||
+			// hm != null && null != hm.get(date)) // or is date in list of
+			// holidays?
+			// return false;
+			//
+			//
+			// TimeStamp tsStart = new TimeStamp(date + 'T' + open + '!' +
+			// m_timeZone);
+			// TimeStamp tsEnd = new TimeStamp(date + 'T' + close + '!' +
+			// m_timeZone);
+			//
+			// if (ts.before(tsStart) || ts.after(tsEnd))
+			// return false;
+			//
+			// }
+			// catch (BDTypeException ex) {
+			// System.err.println("Date error: " + ex);
+			// }
+			//
+			return true;
+
+		}
+
+		/**
+		 * Returns true if market is open for specified Date and FI Type
+		 * (partial dates will be treated as not open); times will not be
+		 * checked at all
+		 * 
+		 * @return boolean
+		 */
+		public boolean isOpen(Date date, String fiType) {
+
+			if (m_code.equals("M")) { //$NON-NLS-1$
+				System.err
+						.println("Montreal Exchange forced closed for testing!"); //$NON-NLS-1$
+				System.err.println("Remember to correct code later!"); //$NON-NLS-1$
+				return false;
+			}
+
+			boolean closeInd = false;
+			if (m_times != null) {
+				List list = (List) m_times.get(fiType);
+				closeInd = list.get(0).equals("1"); //$NON-NLS-1$
+			}
+
+			if (closeInd)
+				return false;
+
+			// try {TimeStamp timeWithinDate = new TimeStamp(date + "T12:00!" +
+			// m_timeZone);
+			//
+			// TimeZone tz = TimeTz.GetTimeZone(m_timeZone); // get from
+			// BDTHelper table
+			// Calendar cal = new GregorianCalendar(tz); // needed to obtain day
+			// of week
+			// cal.setTime(timeWithinDate);
+			// int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
+			// HashMap hm = getHolidays();
+			// if (dayOfWeek == Calendar.SATURDAY || dayOfWeek ==
+			// Calendar.SUNDAY ||
+			// hm != null && null != hm.get(date)) // or is date in list of
+			// holidays?
+			// return false;
+			//
+			//
+			// }
+			// catch (BDTypeException ex) {
+			// System.err.println("Date error: " + ex);
+			// }
+
+			return true;
+
+		}
+
+		/**
+		 * Get HashMap of open/close times
+		 */
+
+		public Map<String, List<Time>> getTimes() {
+			return m_times;
+		}
+
+		/**
+		 * Set HashMap with open/close times
+		 */
+
+		public void setTimes(HashMap<String, List<Time>> hm) {
+			m_times = hm;
+		}
+
+		/**
+		 * Insert the method's description here. Creation date: (9/20/00 2:49:20
+		 * PM)
+		 * 
+		 * @return java.lang.String
+		 */
+		public String serialize() {
+
+			String str = m_code + ';' + m_timeZone + ';' + m_countryCode + ';'
+					+ m_quoteCurrency + ';' + '{';
+			Iterator iter = m_times.keySet().iterator();
+			boolean first = true;
+			while (iter.hasNext()) {
+				if (!first)
+					str = str + ';';
+				first = false;
+				String key = (String) iter.next();
+				List vec = (List) m_times.get(key);
+				str = str
+						+ key
+						+ "={" + vec.get(0) + ';' + vec.get(1) + ';' + vec.get(2) + '}'; //$NON-NLS-1$
+			}
+			str = str + "}{"; //$NON-NLS-1$
+
+			iter = m_holidays.keySet().iterator();
+			first = true;
+			while (iter.hasNext()) {
+				if (!first)
+					str = str + ';';
+				first = false;
+				Date d = (Date) iter.next();
+				str = str + d.toString();
+			}
+			str = str + '}';
+			return str;
+
+		}
+
+		MarketImpl(String s1, String s2, String s3, String s4) {
+			m_code = s1;
+			m_timeZone = s2;
+			m_countryCode = s3;
+			m_quoteCurrency = s4;
+		}
+
+		public String getTimeZone() {
+			return m_timeZone;
+		}
+
+		public synchronized Map<Date, Holiday> getHolidays() {
+			return m_holidays;
+		}
+
+		public synchronized void setHolidays(Map<Date, Holiday> hm) {
+			m_holidays = hm;
+		}
+
+		public Map<Date, Holiday> getReplHolidays() {
+			return m_replHolidays;
+		}
+
+		public void setReplHolidays(Map<Date, Holiday> hm) {
+			m_replHolidays = hm;
+		}
+
+		public void setTimes(Map<String, List<Time>> hm) {
+			m_times = hm;
+		}
+
+		public String getName() {
+			return m_name;
+		}
+
+		public String getSymbol() {
+			return m_symbol;
+		}
+
+	}
+
+	/**
+	 * Insert the method's description here. Creation date: (9/22/00 4:09:05 PM)
+	 * 
+	 * @return com.jpmorrsn.jbdtypes.IMarket
+	 * @param s1
+	 *            java.lang.String
+	 * @param s2
+	 *            java.lang.String
+	 * @param s3
+	 *            java.lang.String
+	 * @param s4
+	 *            java.lang.String
+	 */
+	static IMarket createMarket(String s1, String s2, String s3, String s4) {
+		return new MarketImpl(s1, s2, s3, s4);
+	}
+
+	/**
+	 * Return an IMarket object given the name - return null if string empty
+	 * 
+	 * @return org.eclipse.uomo.business.types.IMarket
+	 * @param s
+	 *            java.lang.String
+	 */
+	public static IMarket get(String s) throws BDTypeException {
+
+		if (s.equals("")) //$NON-NLS-1$
+			return null;
+		else {
+			IMarket mkt = BDTHelper.getMarkets().get(s);
+			if (mkt == null) {
+				// System.err.println("Invalid market code: " + s);
+				throw new BDTypeException(NLS.bind(
+						Messages.Market_invalid_code, s)); //$NON-NLS-1$
+			}
+			return mkt;
+		}
+	}
+}
diff --git a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/impl/TimeStamp.java b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/impl/TimeStamp.java
index 7d0f887..1623160 100644
--- a/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/impl/TimeStamp.java
+++ b/bundles/org.eclipse.uomo.business/src/main/java/org/eclipse/uomo/business/types/impl/TimeStamp.java
@@ -1,318 +1,318 @@
-/**
- * Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.business.types.impl;
-
-import static org.eclipse.uomo.business.types.impl.DataHelper.BDT_DELIM;
-
-import java.text.SimpleDateFormat;
-import java.text.ParsePosition;
-import java.util.Calendar;
-import java.util.GregorianCalendar;
-import java.util.TimeZone;
-import java.sql.Timestamp;
-
-import org.eclipse.uomo.business.types.IBasicType;
-import org.eclipse.uomo.core.UOMoRuntimeException;
-
-/**
- * Timestamp extends java.util.Date, which goes down to the millisecond
- * 
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- */
-public class TimeStamp extends java.util.Date implements IBasicType {
-	final static long serialVersionUID = 362498820763181265L;
-
-	/**
-	 * TimeStamp constructor - sets a TimeStamp to the current time
-	 */
-	public TimeStamp() {
-		super((TimeStamp.BuildTimeStamp()).getTime());
-
-	}
-
-	/**
-	 * TimeStamp constructor with millisecs (long)
-	 */
-	public TimeStamp(long m) {
-		super(m);
-
-	}
-
-	/**
-	 * TimeStamp constructor with String. buildTimeStamp returns a TimeStamp
-	 * object, which can't be used directly, so we use getTime
-	 * 
-	 * @throws UOMoRuntimeException
-	 */
-	public TimeStamp(String s) throws UOMoRuntimeException {
-		super((TimeStamp.BuildTimeStamp(s)).getTime());
-	}
-
-	/**
-	 * TimeStamp constructor with a java.sql.Timestamp buildTimeStamp returns a
-	 * TimeStamp object, which can't be used directly, so we use
-	 * getTime
-	 * 
-	 * @throws UOMoRuntimeException
-	 */
-	public TimeStamp(Timestamp ts) throws UOMoRuntimeException {
-		super((TimeStamp.BuildTimeStamp(ts)).getTime());
-	}
-
-	/**
-	 * Create a TimeStamp object using current time
-	 * 
-	 * @return TimeStamp
-	 */
-	static TimeStamp BuildTimeStamp() {
-
-		Calendar aGregCal = new GregorianCalendar();
-
-		java.util.Date date = aGregCal.getTime();
-		return new TimeStamp(date.getTime());
-	}
-
-	/**
-	 * Create an (non-Java.util) TimeStamp using a String. This has format
-	 * ccyymmddThh:mm:ssttt!zone;calendar;era where zone is an alpha time zone
-	 * name known to UOMo; calendar and era are optional. The time from :ss
-	 * is also optional. Instead of !zone, you may instead use Ahh:mm, where A
-	 * is + or -; in this case, no daylight savings time logic is available. If
-	 * adjustment and time zone are both missing, treat as 0, i.e. time is UTC
-	 * If an adjustment is present, the sign is as normally used to identify the
-	 * time zone - i.e. the offset needed to convert UTC to local time, even
-	 * though the first part is local time. This means that, to compute the UTC,
-	 * the sign must be reversed - i.e. local time 08:00 am in the EDT zone will
-	 * be represented as 08:00-04:00, so that UTC is computed by adding the two
-	 * values together. Calendar and era will be ignored for now.
-	 * 
-	 * @return TimeStamp
-	 * @param s
-	 *            java.lang.String
-	 * @throws UOMoRuntimeException
-	 */
-	static TimeStamp BuildTimeStamp(String s) throws UOMoRuntimeException {
-		String str;
-		int sp = s.indexOf(BDT_DELIM); // strip off calendar and/or era
-		if (sp == -1)
-			str = s;
-		else
-			str = s.substring(0, sp);
-
-		String adj = null;
-		TimeZone tz = null;
-
-		sp = str.indexOf('!');
-
-		if (sp > -1) {
-			String zoneString = str.substring(sp + 1);
-			tz = TimeTz.GetTimeZone(zoneString);
-			if (tz == null)
-				throw new UOMoRuntimeException("Time Zone not found: "
-						+ zoneString);
-			str = str.substring(0, sp);
-		}
-
-		else {
-			sp = str.indexOf('+');
-			if (sp == -1)
-				sp = str.indexOf('-');
-			if (sp > -1) {
-				adj = str.substring(sp);
-				str = str.substring(0, sp);
-			}
-		}
-
-		if (str.length() < 14)
-			throw new UOMoRuntimeException("Timestamp too short: " + s);
-
-		if (str.charAt(8) != 'T' || str.charAt(11) != ':')
-			throw new UOMoRuntimeException("Invalid TimeStamp: " + s);
-
-		String secs = "00000";
-
-		if (str.length() > 14) {
-			if (str.charAt(14) != ':')
-				throw new UOMoRuntimeException("Invalid TimeStamp: " + s);
-			if (str.length() != 17 && str.length() != 20)
-				throw new UOMoRuntimeException("Invalid TimeStamp: " + s);
-			secs = str.substring(15) + secs;
-			secs = secs.substring(0, 5);
-		}
-		TimeZone zone = TimeZone.getTimeZone("UTC");
-
-		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHH:mmssSSS");
-		formatter.setTimeZone(zone);
-
-		String dateString = str.substring(0, 8) + str.substring(9, 14) + secs;
-
-		ParsePosition pos = new ParsePosition(0);
-		java.util.Date date = formatter.parse(dateString, pos);
-		TimeStamp ts = new TimeStamp(date.getTime());
-
-		long millis = 0;
-
-		if (tz != null) {
-			millis = ts.getTime();
-			millis -= tz.getRawOffset();
-			ts.setTime(millis);
-			if (tz.inDaylightTime(ts))
-				millis -= 3600000;
-			ts.setTime(millis);
-		}
-
-		if (adj != null) {
-			int hrs;
-			int mins = 0;
-
-			if (adj.length() == 3)
-				hrs = Integer.parseInt(adj.substring(1));
-			else {
-				if (adj.charAt(3) != ':' || adj.length() != 6)
-					throw new UOMoRuntimeException(
-							"Invalid TimeStamp adjustment: " + s);
-				hrs = Integer.parseInt(adj.substring(1, 3));
-				mins = Integer.parseInt(adj.substring(4, 6));
-			}
-
-			if (adj.charAt(0) == '+') {
-				hrs = -hrs;
-				mins = -mins;
-			} else if (adj.charAt(0) != '-')
-				throw new UOMoRuntimeException(
-						"Invalid TimeStamp adjustment sign: " + s);
-
-			millis = ts.getTime();
-
-			millis += (3600 * hrs + 60 * mins) * 1000;
-
-			ts.setTime(millis);
-		}
-
-		return ts;
-	}
-
-	/**
-	 * Create an TimeStamp using a java.sql.Timestamp. This differs
-	 * from an UOMo TimeStamp in that it goes down to the nanosecond. We
-	 * will therefore lose fractional milliseconds.
-	 * 
-	 * @return TimeStamp
-	 * @param ts
-	 *            java.sql.Timestamp
-	 * @throws UOMoRuntimeException
-	 */
-	static TimeStamp BuildTimeStamp(java.sql.Timestamp ts)
-			throws UOMoRuntimeException {
-		long millis = ts.getTime(); // gets integral number of seconds
-		millis += ts.getNanos() / 1000000;
-		return new TimeStamp(millis);
-	}
-
-	/**
-	 * Convert this TimeStamp to a java.sql.Timestamp
-	 * 
-	 * @return java.sql.Timestamp
-	 */
-	public Timestamp convertToSQL() {
-
-		long millis = getTime() % 1000;
-		java.sql.Timestamp ts = new Timestamp(this.getTime() - millis);
-		ts.setNanos((new Long(millis * 1000000)).intValue());
-		return ts;
-
-	}
-
-	/**
-	 * Format a (non-Java.util) TimeStamp object with specified alpha zone or
-	 * numeric (+/-) zone
-	 * 
-	 * @return java.lang.String
-	 * @throws UOMoRuntimeException
-	 */
-	public String formatWithZone(String s) throws UOMoRuntimeException {
-
-		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHH:mm:ssSSS");
-		TimeZone zone = TimeZone.getTimeZone("UTC");
-
-		formatter.setTimeZone(zone);
-
-		long millis = getTime();
-
-		TimeStamp ts = new TimeStamp(millis);
-
-		String z = s;
-
-		if (s.charAt(0) == '+' || s.charAt(0) == '-') {
-			int hrs;
-			int mins = 0;
-
-			if (s.length() == 3)
-				hrs = Integer.parseInt(s.substring(1));
-			else {
-				if (s.charAt(3) != ':' || s.length() != 6)
-					throw new UOMoRuntimeException(
-							"Invalid TimeStamp adjustment: " + s);
-				hrs = Integer.parseInt(s.substring(1, 3));
-				mins = Integer.parseInt(s.substring(4, 6));
-			}
-
-			if (s.charAt(0) == '-') {
-				hrs = -hrs;
-				mins = -mins;
-			}
-			millis += (hrs * 3600 + mins * 60) * 1000;
-			ts.setTime(millis);
-		} else {
-			TimeZone tz = TimeTz.GetTimeZone(s);
-			if (tz == null)
-				throw new UOMoRuntimeException("Time Zone not found: " + s);
-			millis += tz.getRawOffset();
-			ts.setTime(millis);
-			if (tz.inDaylightTime(ts))
-				ts.setTime(millis + 3600000);
-			z = '!' + s;
-		}
-
-		String str = formatter.format(ts);
-		str = str.substring(0, 8) + 'T' + str.substring(8) + z;
-
-		return str;
-
-	}
-
-	/**
-	 * Display a (non-Java.util) TimeStamp object as a 26-byte string
-	 * 
-	 * @return java.lang.String
-	 */
-	public String serialize() {
-
-		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHH:mm:ssSSS");
-		TimeZone zone = TimeZone.getTimeZone("UTC");
-
-		formatter.setTimeZone(zone);
-
-		String str = formatter.format(this);
-		str = str.substring(0, 8) + 'T' + str.substring(8) + "+00:00";
-		return str;
-
-	}
-
-	/**
-	 * Create a String from this object
-	 * 
-	 * @return java.lang.String
-	 */
-	public String toString() {
-		return serialize();
-	}
-}
+/**
+ * Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.business.types.impl;
+
+import static org.eclipse.uomo.business.types.impl.DataHelper.BDT_DELIM;
+
+import java.text.SimpleDateFormat;
+import java.text.ParsePosition;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+import java.sql.Timestamp;
+
+import org.eclipse.uomo.business.types.IBasicType;
+import org.eclipse.uomo.core.UOMoRuntimeException;
+
+/**
+ * Timestamp extends java.util.Date, which goes down to the millisecond
+ * 
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ */
+public class TimeStamp extends java.util.Date implements IBasicType {
+	final static long serialVersionUID = 362498820763181265L;
+
+	/**
+	 * TimeStamp constructor - sets a TimeStamp to the current time
+	 */
+	public TimeStamp() {
+		super((TimeStamp.BuildTimeStamp()).getTime());
+
+	}
+
+	/**
+	 * TimeStamp constructor with millisecs (long)
+	 */
+	public TimeStamp(long m) {
+		super(m);
+
+	}
+
+	/**
+	 * TimeStamp constructor with String. buildTimeStamp returns a TimeStamp
+	 * object, which can't be used directly, so we use getTime
+	 * 
+	 * @throws UOMoRuntimeException
+	 */
+	public TimeStamp(String s) throws UOMoRuntimeException {
+		super((TimeStamp.BuildTimeStamp(s)).getTime());
+	}
+
+	/**
+	 * TimeStamp constructor with a java.sql.Timestamp buildTimeStamp returns a
+	 * TimeStamp object, which can't be used directly, so we use
+	 * getTime
+	 * 
+	 * @throws UOMoRuntimeException
+	 */
+	public TimeStamp(Timestamp ts) throws UOMoRuntimeException {
+		super((TimeStamp.BuildTimeStamp(ts)).getTime());
+	}
+
+	/**
+	 * Create a TimeStamp object using current time
+	 * 
+	 * @return TimeStamp
+	 */
+	static TimeStamp BuildTimeStamp() {
+
+		Calendar aGregCal = new GregorianCalendar();
+
+		java.util.Date date = aGregCal.getTime();
+		return new TimeStamp(date.getTime());
+	}
+
+	/**
+	 * Create an (non-Java.util) TimeStamp using a String. This has format
+	 * ccyymmddThh:mm:ssttt!zone;calendar;era where zone is an alpha time zone
+	 * name known to UOMo; calendar and era are optional. The time from :ss
+	 * is also optional. Instead of !zone, you may instead use Ahh:mm, where A
+	 * is + or -; in this case, no daylight savings time logic is available. If
+	 * adjustment and time zone are both missing, treat as 0, i.e. time is UTC
+	 * If an adjustment is present, the sign is as normally used to identify the
+	 * time zone - i.e. the offset needed to convert UTC to local time, even
+	 * though the first part is local time. This means that, to compute the UTC,
+	 * the sign must be reversed - i.e. local time 08:00 am in the EDT zone will
+	 * be represented as 08:00-04:00, so that UTC is computed by adding the two
+	 * values together. Calendar and era will be ignored for now.
+	 * 
+	 * @return TimeStamp
+	 * @param s
+	 *            java.lang.String
+	 * @throws UOMoRuntimeException
+	 */
+	static TimeStamp BuildTimeStamp(String s) throws UOMoRuntimeException {
+		String str;
+		int sp = s.indexOf(BDT_DELIM); // strip off calendar and/or era
+		if (sp == -1)
+			str = s;
+		else
+			str = s.substring(0, sp);
+
+		String adj = null;
+		TimeZone tz = null;
+
+		sp = str.indexOf('!');
+
+		if (sp > -1) {
+			String zoneString = str.substring(sp + 1);
+			tz = TimeTz.GetTimeZone(zoneString);
+			if (tz == null)
+				throw new UOMoRuntimeException("Time Zone not found: "
+						+ zoneString);
+			str = str.substring(0, sp);
+		}
+
+		else {
+			sp = str.indexOf('+');
+			if (sp == -1)
+				sp = str.indexOf('-');
+			if (sp > -1) {
+				adj = str.substring(sp);
+				str = str.substring(0, sp);
+			}
+		}
+
+		if (str.length() < 14)
+			throw new UOMoRuntimeException("Timestamp too short: " + s);
+
+		if (str.charAt(8) != 'T' || str.charAt(11) != ':')
+			throw new UOMoRuntimeException("Invalid TimeStamp: " + s);
+
+		String secs = "00000";
+
+		if (str.length() > 14) {
+			if (str.charAt(14) != ':')
+				throw new UOMoRuntimeException("Invalid TimeStamp: " + s);
+			if (str.length() != 17 && str.length() != 20)
+				throw new UOMoRuntimeException("Invalid TimeStamp: " + s);
+			secs = str.substring(15) + secs;
+			secs = secs.substring(0, 5);
+		}
+		TimeZone zone = TimeZone.getTimeZone("UTC");
+
+		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHH:mmssSSS");
+		formatter.setTimeZone(zone);
+
+		String dateString = str.substring(0, 8) + str.substring(9, 14) + secs;
+
+		ParsePosition pos = new ParsePosition(0);
+		java.util.Date date = formatter.parse(dateString, pos);
+		TimeStamp ts = new TimeStamp(date.getTime());
+
+		long millis = 0;
+
+		if (tz != null) {
+			millis = ts.getTime();
+			millis -= tz.getRawOffset();
+			ts.setTime(millis);
+			if (tz.inDaylightTime(ts))
+				millis -= 3600000;
+			ts.setTime(millis);
+		}
+
+		if (adj != null) {
+			int hrs;
+			int mins = 0;
+
+			if (adj.length() == 3)
+				hrs = Integer.parseInt(adj.substring(1));
+			else {
+				if (adj.charAt(3) != ':' || adj.length() != 6)
+					throw new UOMoRuntimeException(
+							"Invalid TimeStamp adjustment: " + s);
+				hrs = Integer.parseInt(adj.substring(1, 3));
+				mins = Integer.parseInt(adj.substring(4, 6));
+			}
+
+			if (adj.charAt(0) == '+') {
+				hrs = -hrs;
+				mins = -mins;
+			} else if (adj.charAt(0) != '-')
+				throw new UOMoRuntimeException(
+						"Invalid TimeStamp adjustment sign: " + s);
+
+			millis = ts.getTime();
+
+			millis += (3600 * hrs + 60 * mins) * 1000;
+
+			ts.setTime(millis);
+		}
+
+		return ts;
+	}
+
+	/**
+	 * Create an TimeStamp using a java.sql.Timestamp. This differs
+	 * from an UOMo TimeStamp in that it goes down to the nanosecond. We
+	 * will therefore lose fractional milliseconds.
+	 * 
+	 * @return TimeStamp
+	 * @param ts
+	 *            java.sql.Timestamp
+	 * @throws UOMoRuntimeException
+	 */
+	static TimeStamp BuildTimeStamp(java.sql.Timestamp ts)
+			throws UOMoRuntimeException {
+		long millis = ts.getTime(); // gets integral number of seconds
+		millis += ts.getNanos() / 1000000;
+		return new TimeStamp(millis);
+	}
+
+	/**
+	 * Convert this TimeStamp to a java.sql.Timestamp
+	 * 
+	 * @return java.sql.Timestamp
+	 */
+	public Timestamp convertToSQL() {
+
+		long millis = getTime() % 1000;
+		java.sql.Timestamp ts = new Timestamp(this.getTime() - millis);
+		ts.setNanos((new Long(millis * 1000000)).intValue());
+		return ts;
+
+	}
+
+	/**
+	 * Format a (non-Java.util) TimeStamp object with specified alpha zone or
+	 * numeric (+/-) zone
+	 * 
+	 * @return java.lang.String
+	 * @throws UOMoRuntimeException
+	 */
+	public String formatWithZone(String s) throws UOMoRuntimeException {
+
+		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHH:mm:ssSSS");
+		TimeZone zone = TimeZone.getTimeZone("UTC");
+
+		formatter.setTimeZone(zone);
+
+		long millis = getTime();
+
+		TimeStamp ts = new TimeStamp(millis);
+
+		String z = s;
+
+		if (s.charAt(0) == '+' || s.charAt(0) == '-') {
+			int hrs;
+			int mins = 0;
+
+			if (s.length() == 3)
+				hrs = Integer.parseInt(s.substring(1));
+			else {
+				if (s.charAt(3) != ':' || s.length() != 6)
+					throw new UOMoRuntimeException(
+							"Invalid TimeStamp adjustment: " + s);
+				hrs = Integer.parseInt(s.substring(1, 3));
+				mins = Integer.parseInt(s.substring(4, 6));
+			}
+
+			if (s.charAt(0) == '-') {
+				hrs = -hrs;
+				mins = -mins;
+			}
+			millis += (hrs * 3600 + mins * 60) * 1000;
+			ts.setTime(millis);
+		} else {
+			TimeZone tz = TimeTz.GetTimeZone(s);
+			if (tz == null)
+				throw new UOMoRuntimeException("Time Zone not found: " + s);
+			millis += tz.getRawOffset();
+			ts.setTime(millis);
+			if (tz.inDaylightTime(ts))
+				ts.setTime(millis + 3600000);
+			z = '!' + s;
+		}
+
+		String str = formatter.format(ts);
+		str = str.substring(0, 8) + 'T' + str.substring(8) + z;
+
+		return str;
+
+	}
+
+	/**
+	 * Display a (non-Java.util) TimeStamp object as a 26-byte string
+	 * 
+	 * @return java.lang.String
+	 */
+	public String serialize() {
+
+		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHH:mm:ssSSS");
+		TimeZone zone = TimeZone.getTimeZone("UTC");
+
+		formatter.setTimeZone(zone);
+
+		String str = formatter.format(this);
+		str = str.substring(0, 8) + 'T' + str.substring(8) + "+00:00";
+		return str;
+
+	}
+
+	/**
+	 * Create a String from this object
+	 * 
+	 * @return java.lang.String
+	 */
+	public String toString() {
+		return serialize();
+	}
+}
diff --git a/bundles/org.eclipse.uomo.core.tests/.classpath b/bundles/org.eclipse.uomo.core.tests/.classpath
index 0b1bcf9..9bc33d3 100644
--- a/bundles/org.eclipse.uomo.core.tests/.classpath
+++ b/bundles/org.eclipse.uomo.core.tests/.classpath
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src/"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/bundles/org.eclipse.uomo.core.tests/.gitignore b/bundles/org.eclipse.uomo.core.tests/.gitignore
index ea8c4bf..0b42d2d 100644
--- a/bundles/org.eclipse.uomo.core.tests/.gitignore
+++ b/bundles/org.eclipse.uomo.core.tests/.gitignore
@@ -1 +1 @@
-/target
+/target
diff --git a/bundles/org.eclipse.uomo.core.tests/.project b/bundles/org.eclipse.uomo.core.tests/.project
index 9ad70dd..9702ecc 100644
--- a/bundles/org.eclipse.uomo.core.tests/.project
+++ b/bundles/org.eclipse.uomo.core.tests/.project
@@ -1,34 +1,34 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.uomo.core.tests</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.uomo.core.tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/bundles/org.eclipse.uomo.core.tests/.settings/.gitignore b/bundles/org.eclipse.uomo.core.tests/.settings/.gitignore
index 0924da4..c14d360 100644
--- a/bundles/org.eclipse.uomo.core.tests/.settings/.gitignore
+++ b/bundles/org.eclipse.uomo.core.tests/.settings/.gitignore
@@ -1 +1 @@
-/org.eclipse.m2e.core.prefs
+/org.eclipse.m2e.core.prefs
diff --git a/bundles/org.eclipse.uomo.core.tests/META-INF/MANIFEST.MF b/bundles/org.eclipse.uomo.core.tests/META-INF/MANIFEST.MF
index 4d0b866..b48f324 100644
--- a/bundles/org.eclipse.uomo.core.tests/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.uomo.core.tests/META-INF/MANIFEST.MF
@@ -1,10 +1,10 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: UOMO Core Tests
-Bundle-SymbolicName: org.eclipse.uomo.core.tests
-Bundle-Version: 0.7.0.qualifier
-Bundle-Vendor: Eclipse org
-Fragment-Host: org.eclipse.uomo.core;bundle-version="0.7.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Export-Package: org.eclipse.uomo.core.impl;uses:="org.eclipse.uomo.core"
-Require-Bundle: org.junit
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: UOMO Core Tests
+Bundle-SymbolicName: org.eclipse.uomo.core.tests
+Bundle-Version: 0.7.0.qualifier
+Bundle-Vendor: Eclipse org
+Fragment-Host: org.eclipse.uomo.core;bundle-version="0.7.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Export-Package: org.eclipse.uomo.core.impl;uses:="org.eclipse.uomo.core"
+Require-Bundle: org.junit
diff --git a/bundles/org.eclipse.uomo.core.tests/build.properties b/bundles/org.eclipse.uomo.core.tests/build.properties
index ced5f40..c4e35e4 100644
--- a/bundles/org.eclipse.uomo.core.tests/build.properties
+++ b/bundles/org.eclipse.uomo.core.tests/build.properties
@@ -1,4 +1,4 @@
-source.. = src/
-output.. = target/classes
-bin.includes = META-INF/,\
-               .
+source.. = src/
+output.. = target/classes
+bin.includes = META-INF/,\
+               .
diff --git a/bundles/org.eclipse.uomo.core.tests/pom.xml b/bundles/org.eclipse.uomo.core.tests/pom.xml
index 7b4aabc..cdbfb2d 100644
--- a/bundles/org.eclipse.uomo.core.tests/pom.xml
+++ b/bundles/org.eclipse.uomo.core.tests/pom.xml
@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
-	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<artifactId>org.eclipse.uomo.bundles</artifactId>
-		<groupId>org.eclipse.uomo</groupId>
-		<version>0.7.0-SNAPSHOT</version>
-	</parent>
-	<artifactId>org.eclipse.uomo.core.tests</artifactId>
-	<name>UOMo Core Tests</name>
-	<packaging>eclipse-test-plugin</packaging>
+<?xml version="1.0" encoding="UTF-8"?>
+<project
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<artifactId>org.eclipse.uomo.bundles</artifactId>
+		<groupId>org.eclipse.uomo</groupId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.uomo.core.tests</artifactId>
+	<name>UOMo Core Tests</name>
+	<packaging>eclipse-test-plugin</packaging>
 </project>
\ No newline at end of file
diff --git a/bundles/org.eclipse.uomo.core.tests/src/log4j.properties b/bundles/org.eclipse.uomo.core.tests/src/log4j.properties
index 18cfaa3..1b4557b 100644
--- a/bundles/org.eclipse.uomo.core.tests/src/log4j.properties
+++ b/bundles/org.eclipse.uomo.core.tests/src/log4j.properties
@@ -1,8 +1,8 @@
-log4j.rootCategory=INFO, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout.ConversionPattern=%t %p [%c] - %m%n
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.threshold=TRACE
-
-#log4j.logger.org.springframework.osgi=DEBUG
+log4j.rootCategory=INFO, stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout.ConversionPattern=%t %p [%c] - %m%n
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.threshold=TRACE
+
+#log4j.logger.org.springframework.osgi=DEBUG
 #log4j.logger.org.springframework=DEBUG
\ No newline at end of file
diff --git a/bundles/org.eclipse.uomo.core.tests/src/org/eclipse/uomo/core/impl/BeanImplTest.java b/bundles/org.eclipse.uomo.core.tests/src/org/eclipse/uomo/core/impl/BeanImplTest.java
index 816e745..0e54980 100644
--- a/bundles/org.eclipse.uomo.core.tests/src/org/eclipse/uomo/core/impl/BeanImplTest.java
+++ b/bundles/org.eclipse.uomo.core.tests/src/org/eclipse/uomo/core/impl/BeanImplTest.java
@@ -1,15 +1,15 @@
-package org.eclipse.uomo.core.impl;
-
-import junit.framework.TestCase;
-
-import org.eclipse.uomo.core.IBean;
-import org.eclipse.uomo.core.impl.Bean;
-
-public class BeanImplTest extends TestCase {
-
-    public void testBeanIsABean() {
-	IBean aBean = new Bean();
-        assertTrue(aBean.isABean());
-    }
-
+package org.eclipse.uomo.core.impl;
+
+import junit.framework.TestCase;
+
+import org.eclipse.uomo.core.IBean;
+import org.eclipse.uomo.core.impl.Bean;
+
+public class BeanImplTest extends TestCase {
+
+    public void testBeanIsABean() {
+	IBean aBean = new Bean();
+        assertTrue(aBean.isABean());
+    }
+
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.uomo.core/.classpath b/bundles/org.eclipse.uomo.core/.classpath
index 710ceaa..7e0a6d5 100644
--- a/bundles/org.eclipse.uomo.core/.classpath
+++ b/bundles/org.eclipse.uomo.core/.classpath
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry exported="true" kind="lib" path="libs/unit-api-0.6.1.jar"/>
-	<classpathentry kind="src" path="src/main/java/"/>
-	<classpathentry kind="src" path="src/main/resources/"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry exported="true" kind="lib" path="libs/unit-api-0.6.1.jar"/>
+	<classpathentry kind="src" path="src/main/java/"/>
+	<classpathentry kind="src" path="src/main/resources/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/bundles/org.eclipse.uomo.core/.gitignore b/bundles/org.eclipse.uomo.core/.gitignore
index df81231..f97c089 100644
--- a/bundles/org.eclipse.uomo.core/.gitignore
+++ b/bundles/org.eclipse.uomo.core/.gitignore
@@ -1,3 +1,3 @@
-/target
-/eclipse_config
-/.settings
+/target
+/eclipse_config
+/.settings
diff --git a/bundles/org.eclipse.uomo.core/.project b/bundles/org.eclipse.uomo.core/.project
index f1f433b..90f912b 100644
--- a/bundles/org.eclipse.uomo.core/.project
+++ b/bundles/org.eclipse.uomo.core/.project
@@ -1,60 +1,60 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.uomo.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.wst.common.project.facet.core.builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.jboss.tools.jst.web.kb.kbbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.jboss.tools.cdi.core.cdibuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.wst.validation.validationbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
-		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
-		<nature>com.springsource.server.ide.facet.core.bundlenature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-		<nature>org.jboss.tools.jst.web.kb.kbnature</nature>
-		<nature>org.jboss.tools.cdi.core.cdinature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.uomo.core</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.jboss.tools.jst.web.kb.kbbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.jboss.tools.cdi.core.cdibuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.validation.validationbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+		<nature>com.springsource.server.ide.facet.core.bundlenature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.jboss.tools.jst.web.kb.kbnature</nature>
+		<nature>org.jboss.tools.cdi.core.cdinature</nature>
+	</natures>
+</projectDescription>
diff --git a/bundles/org.eclipse.uomo.core/libs/README b/bundles/org.eclipse.uomo.core/libs/README
index 9edcad5..3b4d98f 100644
--- a/bundles/org.eclipse.uomo.core/libs/README
+++ b/bundles/org.eclipse.uomo.core/libs/README
@@ -1,3 +1,3 @@
-This jar file is included here because it cannot be downloaded from a public p2 repository at this time.
-
+This jar file is included here because it cannot be downloaded from a public p2 repository at this time.
+
 If this file is included in Orbit - it can be removed.
\ No newline at end of file
diff --git a/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/IBean.java b/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/IBean.java
index fa6a020..6162629 100644
--- a/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/IBean.java
+++ b/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/IBean.java
@@ -1,25 +1,25 @@
-/******************************************************************************
- * Copyright (c) 1996, 2010, Werner Keil, Creative Arts & Technologies.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *   Werner Keil, Creative Arts & Technologies - initial API and implementation
- *****************************************************************************/
-
-package org.eclipse.uomo.core;
-
-/**
- * A bean.
- *
- * @version $Id$
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @deprecated For integration only
- */
-public interface IBean {
-
-    boolean isABean();
-
+/******************************************************************************
+ * Copyright (c) 1996, 2010, Werner Keil, Creative Arts & Technologies.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *   Werner Keil, Creative Arts & Technologies - initial API and implementation
+ *****************************************************************************/
+
+package org.eclipse.uomo.core;
+
+/**
+ * A bean.
+ *
+ * @version $Id$
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @deprecated For integration only
+ */
+public interface IBean {
+
+    boolean isABean();
+
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/IDescription.java b/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/IDescription.java
index 72df53e..b66641c 100644
--- a/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/IDescription.java
+++ b/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/IDescription.java
@@ -1,22 +1,22 @@
-/******************************************************************************
- * Copyright (c) 1996, 2010, Werner Keil, Creative Arts & Technologies.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *   Werner Keil, Creative Arts & Technologies - initial API and implementation
- *****************************************************************************/
-
-package org.eclipse.uomo.core;
-
-/**
- * Denote entity that has a description.
- *
- * @version $Id: IIDescription.java 63 2010-07-19 10:35:31Z werner.keil $
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- */
-public interface IDescription {
-	String getDescription();
+/******************************************************************************
+ * Copyright (c) 1996, 2010, Werner Keil, Creative Arts & Technologies.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *   Werner Keil, Creative Arts & Technologies - initial API and implementation
+ *****************************************************************************/
+
+package org.eclipse.uomo.core;
+
+/**
+ * Denote entity that has a description.
+ *
+ * @version $Id: IIDescription.java 63 2010-07-19 10:35:31Z werner.keil $
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ */
+public interface IDescription {
+	String getDescription();
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/IValue.java b/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/IValue.java
index 9671de2..98de649 100644
--- a/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/IValue.java
+++ b/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/IValue.java
@@ -1,22 +1,22 @@
-/******************************************************************************
- * Copyright (c) 2011, 2014 Werner Keil, Creative Arts & Technologies.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *   Werner Keil, Creative Arts & Technologies - initial API and implementation
- *****************************************************************************/
-
-package org.eclipse.uomo.core;
-
-/**
- * Denote entity that has a {@code V} value.
- *
- * @version 0.3
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- */
-public interface IValue<V> {
-	V getValue();
+/******************************************************************************
+ * Copyright (c) 2011, 2014 Werner Keil, Creative Arts & Technologies.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *   Werner Keil, Creative Arts & Technologies - initial API and implementation
+ *****************************************************************************/
+
+package org.eclipse.uomo.core;
+
+/**
+ * Denote entity that has a {@code V} value.
+ *
+ * @version 0.3
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ */
+public interface IValue<V> {
+	V getValue();
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/impl/Bean.java b/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/impl/Bean.java
index 0b124fe..3fcf49d 100644
--- a/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/impl/Bean.java
+++ b/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/impl/Bean.java
@@ -1,22 +1,22 @@
-/******************************************************************************
- * Copyright (c) 1996, 2010, Werner Keil, Creative Arts & Technologies.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *   Werner Keil, Creative Arts & Technologies - initial API and implementation
- *****************************************************************************/
-
-package org.eclipse.uomo.core.impl;
-
-import org.eclipse.uomo.core.IBean;
-
-public class Bean implements IBean {
-
-    public boolean isABean() {
-	return true;
-    }
-
-}
+/******************************************************************************
+ * Copyright (c) 1996, 2010, Werner Keil, Creative Arts & Technologies.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *   Werner Keil, Creative Arts & Technologies - initial API and implementation
+ *****************************************************************************/
+
+package org.eclipse.uomo.core.impl;
+
+import org.eclipse.uomo.core.IBean;
+
+public class Bean implements IBean {
+
+    public boolean isABean() {
+	return true;
+    }
+
+}
diff --git a/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/impl/CodeValuePair.java b/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/impl/CodeValuePair.java
index 384f193..4ef2777 100644
--- a/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/impl/CodeValuePair.java
+++ b/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/impl/CodeValuePair.java
@@ -1,50 +1,50 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2014 Werner Keil, Creative Arts & Technologies.
- * Crown Copyright (c) 2006, 2007, Copyright (c) 2006, 2007 Jiva Medical.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *    Jiva Medical - initial API and implementation
- *    Werner Keil  - improvements, functional interfaces
- *******************************************************************************/
-
-package org.eclipse.uomo.core.impl;
-
-import org.eclipse.uomo.core.ICode;
-import org.eclipse.uomo.core.IValue;
-
-/**
- * @author Werner Keil
- *
- * @param <V>
- * @param <C>
- */
-public class CodeValuePair<V, C> implements ICode<C>, IValue<V> {
-
-	private V value;
-	private C code;
-	/**
-	 * @param value
-	 * @param code
-	 */
-	public CodeValuePair(V value, C code) {
-		super();
-		this.value = value;
-		this.code = code;
-	}
-	/**
-	 * @return the value
-	 */
-	public V getValue() {
-		return value;
-	}
-	/**
-	 * @return the code
-	 */
-	public C getCode() {
-		return code;
-	}	
-}
+/*******************************************************************************
+ * Copyright (c) 2010, 2014 Werner Keil, Creative Arts & Technologies.
+ * Crown Copyright (c) 2006, 2007, Copyright (c) 2006, 2007 Jiva Medical.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *    Jiva Medical - initial API and implementation
+ *    Werner Keil  - improvements, functional interfaces
+ *******************************************************************************/
+
+package org.eclipse.uomo.core.impl;
+
+import org.eclipse.uomo.core.ICode;
+import org.eclipse.uomo.core.IValue;
+
+/**
+ * @author Werner Keil
+ *
+ * @param <V>
+ * @param <C>
+ */
+public class CodeValuePair<V, C> implements ICode<C>, IValue<V> {
+
+	private V value;
+	private C code;
+	/**
+	 * @param value
+	 * @param code
+	 */
+	public CodeValuePair(V value, C code) {
+		super();
+		this.value = value;
+		this.code = code;
+	}
+	/**
+	 * @return the value
+	 */
+	public V getValue() {
+		return value;
+	}
+	/**
+	 * @return the code
+	 */
+	public C getCode() {
+		return code;
+	}	
+}
diff --git a/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/internal/Activator.java b/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/internal/Activator.java
index 4ff473f..a81ef37 100644
--- a/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/internal/Activator.java
+++ b/bundles/org.eclipse.uomo.core/src/main/java/org/eclipse/uomo/core/internal/Activator.java
@@ -1,50 +1,50 @@
-/**
- * Copyright (c) 2010, 2012 Werner Keil, JScience and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.core.internal;
-
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-/**
- * OSGi part of implementation.
- * 
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 0.3 ($Revision$), $Date$
- */
-public class Activator implements BundleActivator {
-	private BundleContext fContext;
-	
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext
-	 * )
-	 */
-	public void start(BundleContext context) throws Exception {
-		fContext = context;
-	}
-
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		// close the service tracker(s)
-		// stopDictionary();
-		fContext = null;
-	}
-
-}
+/**
+ * Copyright (c) 2010, 2012 Werner Keil, JScience and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.core.internal;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * OSGi part of implementation.
+ * 
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 0.3 ($Revision$), $Date$
+ */
+public class Activator implements BundleActivator {
+	private BundleContext fContext;
+	
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext
+	 * )
+	 */
+	public void start(BundleContext context) throws Exception {
+		fContext = context;
+	}
+
+	
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		// close the service tracker(s)
+		// stopDictionary();
+		fContext = null;
+	}
+
+}
diff --git a/bundles/org.eclipse.uomo.core/src/main/resources/META-INF/spring/bundle-context.xml b/bundles/org.eclipse.uomo.core/src/main/resources/META-INF/spring/bundle-context.xml
index 2459eb0..8c4ef28 100644
--- a/bundles/org.eclipse.uomo.core/src/main/resources/META-INF/spring/bundle-context.xml
+++ b/bundles/org.eclipse.uomo.core/src/main/resources/META-INF/spring/bundle-context.xml
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
-
-  <!-- regular spring configuration file defining the beans for this
-       bundle. We've kept the osgi definitions in a separate 
-       configuration file so that this file can easily be used
-       for integration testing outside of an OSGi environment -->
-
-  <bean name="myBean" class="org.eclipse.uomo.core.impl.BeanImpl" />
-
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+  <!-- regular spring configuration file defining the beans for this
+       bundle. We've kept the osgi definitions in a separate 
+       configuration file so that this file can easily be used
+       for integration testing outside of an OSGi environment -->
+
+  <bean name="myBean" class="org.eclipse.uomo.core.impl.BeanImpl" />
+
 </beans>
\ No newline at end of file
diff --git a/bundles/org.eclipse.uomo.core/src/main/resources/log4j.properties b/bundles/org.eclipse.uomo.core/src/main/resources/log4j.properties
index 18cfaa3..1b4557b 100644
--- a/bundles/org.eclipse.uomo.core/src/main/resources/log4j.properties
+++ b/bundles/org.eclipse.uomo.core/src/main/resources/log4j.properties
@@ -1,8 +1,8 @@
-log4j.rootCategory=INFO, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout.ConversionPattern=%t %p [%c] - %m%n
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.threshold=TRACE
-
-#log4j.logger.org.springframework.osgi=DEBUG
+log4j.rootCategory=INFO, stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout.ConversionPattern=%t %p [%c] - %m%n
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.threshold=TRACE
+
+#log4j.logger.org.springframework.osgi=DEBUG
 #log4j.logger.org.springframework=DEBUG
\ No newline at end of file
diff --git a/bundles/org.eclipse.uomo.ucum.tests/.classpath b/bundles/org.eclipse.uomo.ucum.tests/.classpath
index 0b1bcf9..9bc33d3 100644
--- a/bundles/org.eclipse.uomo.ucum.tests/.classpath
+++ b/bundles/org.eclipse.uomo.ucum.tests/.classpath
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src/"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/bundles/org.eclipse.uomo.ucum.tests/.gitignore b/bundles/org.eclipse.uomo.ucum.tests/.gitignore
index 4dc0091..9f564a8 100644
--- a/bundles/org.eclipse.uomo.ucum.tests/.gitignore
+++ b/bundles/org.eclipse.uomo.ucum.tests/.gitignore
@@ -1,2 +1,2 @@
-/target
-/bin
+/target
+/bin
diff --git a/bundles/org.eclipse.uomo.ucum.tests/.project b/bundles/org.eclipse.uomo.ucum.tests/.project
index 65a1971..c239d3f 100644
--- a/bundles/org.eclipse.uomo.ucum.tests/.project
+++ b/bundles/org.eclipse.uomo.ucum.tests/.project
@@ -1,34 +1,34 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.uomo.ucum.tests</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.uomo.ucum.tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/bundles/org.eclipse.uomo.ucum.tests/.settings/.gitignore b/bundles/org.eclipse.uomo.ucum.tests/.settings/.gitignore
index 0924da4..c14d360 100644
--- a/bundles/org.eclipse.uomo.ucum.tests/.settings/.gitignore
+++ b/bundles/org.eclipse.uomo.ucum.tests/.settings/.gitignore
@@ -1 +1 @@
-/org.eclipse.m2e.core.prefs
+/org.eclipse.m2e.core.prefs
diff --git a/bundles/org.eclipse.uomo.ucum.tests/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.uomo.ucum.tests/.settings/org.eclipse.jdt.core.prefs
index c537b63..f287d53 100644
--- a/bundles/org.eclipse.uomo.ucum.tests/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.uomo.ucum.tests/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/bundles/org.eclipse.uomo.ucum.tests/META-INF/MANIFEST.MF b/bundles/org.eclipse.uomo.ucum.tests/META-INF/MANIFEST.MF
index 6cb9dee..2178429 100644
--- a/bundles/org.eclipse.uomo.ucum.tests/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.uomo.ucum.tests/META-INF/MANIFEST.MF
@@ -1,13 +1,13 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: UCUM Tests
-Bundle-SymbolicName: org.eclipse.uomo.ucum.tests
-Bundle-Version: 0.7.0.qualifier
-Bundle-Vendor: Eclipse.org
-Fragment-Host: org.eclipse.uomo.ucum;bundle-version="0.7.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Export-Package: org.eclipse.uomo.ucum.tests
-Require-Bundle: org.junit;bundle-version="4.8.2",
- org.eclipse.uomo.util;bundle-version="0.7.0",
- org.eclipse.uomo.xml;bundle-version="0.7.0"
-
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: UCUM Tests
+Bundle-SymbolicName: org.eclipse.uomo.ucum.tests
+Bundle-Version: 0.7.0.qualifier
+Bundle-Vendor: Eclipse.org
+Fragment-Host: org.eclipse.uomo.ucum;bundle-version="0.7.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Export-Package: org.eclipse.uomo.ucum.tests
+Require-Bundle: org.junit;bundle-version="4.8.2",
+ org.eclipse.uomo.util;bundle-version="0.7.0",
+ org.eclipse.uomo.xml;bundle-version="0.7.0"
+
diff --git a/bundles/org.eclipse.uomo.ucum.tests/build.properties b/bundles/org.eclipse.uomo.ucum.tests/build.properties
index 34d2e4d..41eb6ad 100644
--- a/bundles/org.eclipse.uomo.ucum.tests/build.properties
+++ b/bundles/org.eclipse.uomo.ucum.tests/build.properties
@@ -1,4 +1,4 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/bundles/org.eclipse.uomo.ucum.tests/etc/org.eclipse.uomo.ucum.tests.launch b/bundles/org.eclipse.uomo.ucum.tests/etc/org.eclipse.uomo.ucum.tests.launch
index 2e7ef92..da2a12b 100644
--- a/bundles/org.eclipse.uomo.ucum.tests/etc/org.eclipse.uomo.ucum.tests.launch
+++ b/bundles/org.eclipse.uomo.ucum.tests/etc/org.eclipse.uomo.ucum.tests.launch
@@ -1,20 +1,20 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/org.eclipse.uomo.ucum.tests"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="4"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
-<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=org.eclipse.uomo.ucum.tests"/>
-<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
-<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
-<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
-<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.uomo.ucum.tests"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
-</launchConfiguration>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/org.eclipse.uomo.ucum.tests"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="4"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=org.eclipse.uomo.ucum.tests"/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
+<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.uomo.ucum.tests"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
+</launchConfiguration>
diff --git a/bundles/org.eclipse.uomo.ucum.tests/src/org/eclipse/uomo/ucum/tests/H3ETTestConfiguration.java b/bundles/org.eclipse.uomo.ucum.tests/src/org/eclipse/uomo/ucum/tests/H3ETTestConfiguration.java
index 4a28125..b318597 100644
--- a/bundles/org.eclipse.uomo.ucum.tests/src/org/eclipse/uomo/ucum/tests/H3ETTestConfiguration.java
+++ b/bundles/org.eclipse.uomo.ucum.tests/src/org/eclipse/uomo/ucum/tests/H3ETTestConfiguration.java
@@ -1,55 +1,55 @@
-/*******************************************************************************
- * Crown Copyright (c) 2006, 2007, Copyright (c) 2006, 2007 Jiva Medical.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *    Jiva Medical - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.uomo.ucum.tests;
-
-//import org.eclipse.uomo.util.test.UOMoTestConfiguration;
-
-
-
-/*
- * we need some ideas here. 
- * 1. copyright. The testing uses a sample project. It's full of things that are open but
- *    not sufficiently unencumbered to be EPL. So it's on
- *    sourceforge @ https://sourceforge.net/projects/ohf-he3t-test
- * 
- * 2. Local directory. We've given up trying to organise some better way to 
- *    organise where the data resides. So it's a constant here, and you simply
- *    change the constant for your local setup.
- *    
- *     Better ideas are welcome
- */
-
-public interface H3ETTestConfiguration   {
-	
-	/**
-	 * The test workspace, which should contains the test project
-	 * org.eclipse.ohf.h3et.test
-	 * 
-	 * NOTE: current setting assume the test workspace contains two projects:
-	 * * org.eclipse.ohf.h3et.test: with a minimised MIF and its related test data
-	 * * ca.infoway.cerx.mif21: Using the Infoway MIFs settings for more general testing 
-	 */
-	public static final String TEST_WORKSPACE = System.getenv("WORKSPACE") != null ? System.getenv("WORKSPACE") : "C:/workspace/data/";
-//	public static final String TEST_PROJECT 			= TEST_WORKSPACE + "org.eclipse.ohf.h3et.test";
-//	public static final String TEST_PROJECT_VOCAB 		= TEST_PROJECT+"/Vocab";
-//	public static final String TEST_PROJECT_MIF 		= TEST_PROJECT+"/Mif";
-//	public static final String TEST_PROJECT_CASES 		= TEST_PROJECT+"/TestCases";
-//	public static final String TEST_PROJECT_FRAGMENTS 	= TEST_PROJECT+"/Mif/Fragments";
-	
-	public static final String WORK_PROJECT 			= TEST_WORKSPACE + "ca.infoway.cerx.mif21";
-	public static final String WORK_PROJECT_VOCAB 		= WORK_PROJECT+"/Vocab";
-	public static final String WORK_PROJECT_MIF 		= WORK_PROJECT+"/Mif";
-	public static final String WORK_PROJECT_CASES 		= WORK_PROJECT+"/TestCases";
-	public static final String WORK_PROJECT_FRAGMENTS 	= WORK_PROJECT+"/Mif/Fragments";
-	public static final String WORK_PROJECT_TESTFOLDER	= WORK_PROJECT+"/unitTests";
-	
-}
+/*******************************************************************************
+ * Crown Copyright (c) 2006, 2007, Copyright (c) 2006, 2007 Jiva Medical.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *    Jiva Medical - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.uomo.ucum.tests;
+
+//import org.eclipse.uomo.util.test.UOMoTestConfiguration;
+
+
+
+/*
+ * we need some ideas here. 
+ * 1. copyright. The testing uses a sample project. It's full of things that are open but
+ *    not sufficiently unencumbered to be EPL. So it's on
+ *    sourceforge @ https://sourceforge.net/projects/ohf-he3t-test
+ * 
+ * 2. Local directory. We've given up trying to organise some better way to 
+ *    organise where the data resides. So it's a constant here, and you simply
+ *    change the constant for your local setup.
+ *    
+ *     Better ideas are welcome
+ */
+
+public interface H3ETTestConfiguration   {
+	
+	/**
+	 * The test workspace, which should contains the test project
+	 * org.eclipse.ohf.h3et.test
+	 * 
+	 * NOTE: current setting assume the test workspace contains two projects:
+	 * * org.eclipse.ohf.h3et.test: with a minimised MIF and its related test data
+	 * * ca.infoway.cerx.mif21: Using the Infoway MIFs settings for more general testing 
+	 */
+	public static final String TEST_WORKSPACE = System.getenv("WORKSPACE") != null ? System.getenv("WORKSPACE") : "C:/workspace/data/";
+//	public static final String TEST_PROJECT 			= TEST_WORKSPACE + "org.eclipse.ohf.h3et.test";
+//	public static final String TEST_PROJECT_VOCAB 		= TEST_PROJECT+"/Vocab";
+//	public static final String TEST_PROJECT_MIF 		= TEST_PROJECT+"/Mif";
+//	public static final String TEST_PROJECT_CASES 		= TEST_PROJECT+"/TestCases";
+//	public static final String TEST_PROJECT_FRAGMENTS 	= TEST_PROJECT+"/Mif/Fragments";
+	
+	public static final String WORK_PROJECT 			= TEST_WORKSPACE + "ca.infoway.cerx.mif21";
+	public static final String WORK_PROJECT_VOCAB 		= WORK_PROJECT+"/Vocab";
+	public static final String WORK_PROJECT_MIF 		= WORK_PROJECT+"/Mif";
+	public static final String WORK_PROJECT_CASES 		= WORK_PROJECT+"/TestCases";
+	public static final String WORK_PROJECT_FRAGMENTS 	= WORK_PROJECT+"/Mif/Fragments";
+	public static final String WORK_PROJECT_TESTFOLDER	= WORK_PROJECT+"/unitTests";
+	
+}
diff --git a/bundles/org.eclipse.uomo.ucum.tests/src/org/eclipse/uomo/ucum/tests/UcumServiceTest.java b/bundles/org.eclipse.uomo.ucum.tests/src/org/eclipse/uomo/ucum/tests/UcumServiceTest.java
index 6836d28..0e8a84d 100644
--- a/bundles/org.eclipse.uomo.ucum.tests/src/org/eclipse/uomo/ucum/tests/UcumServiceTest.java
+++ b/bundles/org.eclipse.uomo.ucum.tests/src/org/eclipse/uomo/ucum/tests/UcumServiceTest.java
@@ -1,120 +1,120 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2013 Werner Keil.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *    Werner Keil - initial API and implementation
- *******************************************************************************/
-package org.eclipse.uomo.ucum.tests;
-
-import static org.junit.Assert.*;
-import static org.eclipse.uomo.core.impl.OutputHelper.*;
-
-import java.math.BigDecimal;
-import java.util.Set;
-
-import org.eclipse.uomo.core.UOMoException;
-import org.eclipse.uomo.ucum.UcumService;
-import org.eclipse.uomo.ucum.expression.Symbol;
-import org.eclipse.uomo.ucum.expression.Term;
-import org.eclipse.uomo.ucum.impl.UcumEssenceService;
-import org.eclipse.uomo.ucum.parsers.ExpressionParser;
-import org.eclipse.uomo.util.Parser;
-import org.junit.Before;
-import org.junit.Test;
-import org.unitsofmeasurement.unit.Unit;
-
-import com.ibm.icu.text.DecimalFormat;
-import com.ibm.icu.text.NumberFormat;
-
-
-/**
- * @author Werner Keil
- * @version 1.4, 2013-12-08
- */
-public class UcumServiceTest {
-	private UcumService ucumService;
-	
-	@Before
-	public void init() {
-		if (ucumService == null) {
-			ucumService = new UcumEssenceService(getClass().getClassLoader().getResourceAsStream("ucum-essence.xml"));
-		}
-	}
-	
-	@Test
-	public void testConversion() {
-		Number mult = ucumService.convert(new BigDecimal(1000d), "l", "m3");
-		assertNotNull(mult);		
-		NumberFormat fmt = new DecimalFormat("#,##0.000");
-		assertEquals(fmt.format(BigDecimal.ONE), fmt.format(mult));
-	}
-
-	@Test
-	public void testProperties() {
-		Set<String> props = ucumService.getProperties();
-		if (isConsoleOutput()) {
-			for (String prop : props) {
-				println(prop);
-			}
-		}
-		assertEquals(98, props.size());
-	}
-	
-	
-	@Test
-	public void testParse() {
-		Parser<String, Term> p = new ExpressionParser(ucumService.getModel());
-		try {
-			Term t =  p.parse("m/s2");
-			assertNotNull(t);
-			assertEquals("DIVISION", t.getOp().toString());
-			Symbol s = (Symbol)t.getComp();
-			Unit<?> u = s.getUnit();
-			assertEquals("m", u.getSymbol());
-		} catch (UOMoException e) {
-			println(e.getLocalizedMessage());
-			fail(e.getLocalizedMessage());
-		}
-	}
-	
-	@Test
-	public void testParseParseMult1() {
-		Parser<String, Term> p = new ExpressionParser(ucumService.getModel());
-		try {
-			Term t =  p.parse("m.s2");
-			assertNotNull(t);
-			assertEquals("MULTIPLICATION", t.getOp().toString());
-			Symbol s = (Symbol)t.getComp();
-			Unit<?> u = s.getUnit();
-			assertEquals("m", u.getSymbol());
-		} catch (UOMoException e) {
-			println(e.getLocalizedMessage());
-			fail(e.getLocalizedMessage());
-		}
-	}
-	
-	/**
-	 * @see <a
-     *  href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=371433">Bugzilla: 371433</a>
-	 */
-	@Test
-	public void testParseParseParenthes1() {
-		Parser<String, Term> p = new ExpressionParser(ucumService.getModel());
-		try {
-			Term t =  p.parse("kg/m/s");
-			assertNotNull(t);
-			assertEquals("DIVISION", t.getOp().toString());
-			Symbol s = (Symbol)t.getComp();
-			Unit<?> u = s.getUnit();
-			assertEquals("g", u.getSymbol());
-			assertEquals("k", s.getPrefix().getSymbol());
-		} catch (UOMoException e) {
-			println(e.getLocalizedMessage());
-			fail(e.getLocalizedMessage());
-		}
-	}
-}
+/*******************************************************************************
+ * Copyright (c) 2010, 2013 Werner Keil.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.uomo.ucum.tests;
+
+import static org.junit.Assert.*;
+import static org.eclipse.uomo.core.impl.OutputHelper.*;
+
+import java.math.BigDecimal;
+import java.util.Set;
+
+import org.eclipse.uomo.core.UOMoException;
+import org.eclipse.uomo.ucum.UcumService;
+import org.eclipse.uomo.ucum.expression.Symbol;
+import org.eclipse.uomo.ucum.expression.Term;
+import org.eclipse.uomo.ucum.impl.UcumEssenceService;
+import org.eclipse.uomo.ucum.parsers.ExpressionParser;
+import org.eclipse.uomo.util.Parser;
+import org.junit.Before;
+import org.junit.Test;
+import org.unitsofmeasurement.unit.Unit;
+
+import com.ibm.icu.text.DecimalFormat;
+import com.ibm.icu.text.NumberFormat;
+
+
+/**
+ * @author Werner Keil
+ * @version 1.4, 2013-12-08
+ */
+public class UcumServiceTest {
+	private UcumService ucumService;
+	
+	@Before
+	public void init() {
+		if (ucumService == null) {
+			ucumService = new UcumEssenceService(getClass().getClassLoader().getResourceAsStream("ucum-essence.xml"));
+		}
+	}
+	
+	@Test
+	public void testConversion() {
+		Number mult = ucumService.convert(new BigDecimal(1000d), "l", "m3");
+		assertNotNull(mult);		
+		NumberFormat fmt = new DecimalFormat("#,##0.000");
+		assertEquals(fmt.format(BigDecimal.ONE), fmt.format(mult));
+	}
+
+	@Test
+	public void testProperties() {
+		Set<String> props = ucumService.getProperties();
+		if (isConsoleOutput()) {
+			for (String prop : props) {
+				println(prop);
+			}
+		}
+		assertEquals(98, props.size());
+	}
+	
+	
+	@Test
+	public void testParse() {
+		Parser<String, Term> p = new ExpressionParser(ucumService.getModel());
+		try {
+			Term t =  p.parse("m/s2");
+			assertNotNull(t);
+			assertEquals("DIVISION", t.getOp().toString());
+			Symbol s = (Symbol)t.getComp();
+			Unit<?> u = s.getUnit();
+			assertEquals("m", u.getSymbol());
+		} catch (UOMoException e) {
+			println(e.getLocalizedMessage());
+			fail(e.getLocalizedMessage());
+		}
+	}
+	
+	@Test
+	public void testParseParseMult1() {
+		Parser<String, Term> p = new ExpressionParser(ucumService.getModel());
+		try {
+			Term t =  p.parse("m.s2");
+			assertNotNull(t);
+			assertEquals("MULTIPLICATION", t.getOp().toString());
+			Symbol s = (Symbol)t.getComp();
+			Unit<?> u = s.getUnit();
+			assertEquals("m", u.getSymbol());
+		} catch (UOMoException e) {
+			println(e.getLocalizedMessage());
+			fail(e.getLocalizedMessage());
+		}
+	}
+	
+	/**
+	 * @see <a
+     *  href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=371433">Bugzilla: 371433</a>
+	 */
+	@Test
+	public void testParseParseParenthes1() {
+		Parser<String, Term> p = new ExpressionParser(ucumService.getModel());
+		try {
+			Term t =  p.parse("kg/m/s");
+			assertNotNull(t);
+			assertEquals("DIVISION", t.getOp().toString());
+			Symbol s = (Symbol)t.getComp();
+			Unit<?> u = s.getUnit();
+			assertEquals("g", u.getSymbol());
+			assertEquals("k", s.getPrefix().getSymbol());
+		} catch (UOMoException e) {
+			println(e.getLocalizedMessage());
+			fail(e.getLocalizedMessage());
+		}
+	}
+}
diff --git a/bundles/org.eclipse.uomo.ucum.tests/src/ucum-essence.xml b/bundles/org.eclipse.uomo.ucum.tests/src/ucum-essence.xml
index c6c6c9b..d45b615 100644
--- a/bundles/org.eclipse.uomo.ucum.tests/src/ucum-essence.xml
+++ b/bundles/org.eclipse.uomo.ucum.tests/src/ucum-essence.xml
@@ -1,2062 +1,2062 @@
-<?xml version="1.0" encoding="ascii"?>
-<root xmlns="http://unitsofmeasure.org/ucum-essence" version="1.9"
-      revision="$Revision: 16410 $"
-      revision-date="$Date: 2013-10-21 21:24:43 -0700 (Mon, 21 Oct 2013) $">
-   <prefix xmlns="" Code="Y" CODE="YA">
-      <name>yotta</name>
-      <printSymbol>Y</printSymbol>
-      <value value="1e24">1 &#215; 10<sup>24</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="Z" CODE="ZA">
-      <name>zetta</name>
-      <printSymbol>Z</printSymbol>
-      <value value="1e21">1 &#215; 10<sup>21</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="E" CODE="EX">
-      <name>exa</name>
-      <printSymbol>E</printSymbol>
-      <value value="1e18">1 &#215; 10<sup>18</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="P" CODE="PT">
-      <name>peta</name>
-      <printSymbol>P</printSymbol>
-      <value value="1e15">1 &#215; 10<sup>15</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="T" CODE="TR">
-      <name>tera</name>
-      <printSymbol>T</printSymbol>
-      <value value="1e12">1 &#215; 10<sup>12</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="G" CODE="GA">
-      <name>giga</name>
-      <printSymbol>G</printSymbol>
-      <value value="1e9">1 &#215; 10<sup>9</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="M" CODE="MA">
-      <name>mega</name>
-      <printSymbol>M</printSymbol>
-      <value value="1e6">1 &#215; 10<sup>6</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="k" CODE="K">
-      <name>kilo</name>
-      <printSymbol>k</printSymbol>
-      <value value="1e3">1 &#215; 10<sup>3</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="h" CODE="H">
-      <name>hecto</name>
-      <printSymbol>h</printSymbol>
-      <value value="1e2">1 &#215; 10<sup>2</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="da" CODE="DA">
-      <name>deka</name>
-      <printSymbol>da</printSymbol>
-      <value value="1e1">1 &#215; 10<sup>1</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="d" CODE="D">
-      <name>deci</name>
-      <printSymbol>d</printSymbol>
-      <value value="1e-1">1 &#215; 10<sup>-1</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="c" CODE="C">
-      <name>centi</name>
-      <printSymbol>c</printSymbol>
-      <value value="1e-2">1 &#215; 10<sup>-2</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="m" CODE="M">
-      <name>milli</name>
-      <printSymbol>m</printSymbol>
-      <value value="1e-3">1 &#215; 10<sup>-3</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="u" CODE="U">
-      <name>micro</name>
-      <printSymbol>&#956;</printSymbol>
-      <value value="1e-6">1 &#215; 10<sup>-6</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="n" CODE="N">
-      <name>nano</name>
-      <printSymbol>n</printSymbol>
-      <value value="1e-9">1 &#215; 10<sup>-9</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="p" CODE="P">
-      <name>pico</name>
-      <printSymbol>p</printSymbol>
-      <value value="1e-12">1 &#215; 10<sup>-12</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="f" CODE="F">
-      <name>femto</name>
-      <printSymbol>f</printSymbol>
-      <value value="1e-15">1 &#215; 10<sup>-15</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="a" CODE="A">
-      <name>atto</name>
-      <printSymbol>a</printSymbol>
-      <value value="1e-18">1 &#215; 10<sup>-18</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="z" CODE="ZO">
-      <name>zepto</name>
-      <printSymbol>z</printSymbol>
-      <value value="1e-21">1 &#215; 10<sup>-21</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="y" CODE="YO">
-      <name>yocto</name>
-      <printSymbol>y</printSymbol>
-      <value value="1e-24">1 &#215; 10<sup>-24</sup>
-      </value>
-   </prefix>
-   <base-unit xmlns="" Code="m" CODE="M" dim="L">
-      <name>meter</name>
-      <printSymbol>m</printSymbol>
-      <property>length</property>
-   </base-unit>
-   <base-unit xmlns="" Code="s" CODE="S" dim="T">
-      <name>second</name>
-      <printSymbol>s</printSymbol>
-      <property>time</property>
-   </base-unit>
-   <base-unit xmlns="" Code="g" CODE="G" dim="M">
-      <name>gram</name>
-      <printSymbol>g</printSymbol>
-      <property>mass</property>
-   </base-unit>
-   <base-unit xmlns="" Code="rad" CODE="RAD" dim="A">
-      <name>radian</name>
-      <printSymbol>rad</printSymbol>
-      <property>plane angle</property>
-   </base-unit>
-   <base-unit xmlns="" Code="K" CODE="K" dim="C">
-      <name>Kelvin</name>
-      <printSymbol>K</printSymbol>
-      <property>temperature</property>
-   </base-unit>
-   <base-unit xmlns="" Code="C" CODE="C" dim="Q">
-      <name>Coulomb</name>
-      <printSymbol>C</printSymbol>
-      <property>electric charge</property>
-   </base-unit>
-   <base-unit xmlns="" Code="cd" CODE="CD" dim="F">
-      <name>candela</name>
-      <printSymbol>cd</printSymbol>
-      <property>luminous intensity</property>
-   </base-unit>
-   <unit xmlns="" Code="10*" CODE="10*" isMetric="no" class="dimless">
-      <name>the number ten for arbitrary powers</name>
-      <printSymbol>10</printSymbol>
-      <property>number</property>
-      <value Unit="1" UNIT="1" value="10">10</value>
-   </unit>
-   <unit xmlns="" Code="10^" CODE="10^" isMetric="no" class="dimless">
-      <name>the number ten for arbitrary powers</name>
-      <printSymbol>10</printSymbol>
-      <property>number</property>
-      <value Unit="1" UNIT="1" value="10">10</value>
-   </unit>
-   <unit xmlns="" Code="[pi]" CODE="[PI]" isMetric="no" class="dimless">
-      <name>the number pi</name>
-      <printSymbol>&#960;</printSymbol>
-      <property>number</property>
-      <value Unit="1" UNIT="1"
-             value="3.1415926535897932384626433832795028841971693993751058209749445923">&#960;</value>
-   </unit>
-   <unit xmlns="" Code="%" CODE="%" isMetric="no" class="dimless">
-      <name>percent</name>
-      <printSymbol>%</printSymbol>
-      <property>fraction</property>
-      <value Unit="10*-2" UNIT="10*-2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[ppth]" CODE="[PPTH]" isMetric="no" class="dimless">
-      <name>parts per thousand</name>
-      <printSymbol>ppth</printSymbol>
-      <property>fraction</property>
-      <value Unit="10*-3" UNIT="10*-3" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[ppm]" CODE="[PPM]" isMetric="no" class="dimless">
-      <name>parts per million</name>
-      <printSymbol>ppm</printSymbol>
-      <property>fraction</property>
-      <value Unit="10*-6" UNIT="10*-6" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[ppb]" CODE="[PPB]" isMetric="no" class="dimless">
-      <name>parts per billion</name>
-      <printSymbol>ppb</printSymbol>
-      <property>fraction</property>
-      <value Unit="10*-9" UNIT="10*-9" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[pptr]" CODE="[PPTR]" isMetric="no" class="dimless">
-      <name>parts per trillion</name>
-      <printSymbol>pptr</printSymbol>
-      <property>fraction</property>
-      <value Unit="10*-12" UNIT="10*-12" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="mol" CODE="MOL" isMetric="yes" class="si">
-      <name>mole</name>
-      <printSymbol>mol</printSymbol>
-      <property>amount of substance</property>
-      <value Unit="10*23" UNIT="10*23" value="6.0221367">6.0221367</value>
-   </unit>
-   <unit xmlns="" Code="sr" CODE="SR" isMetric="yes" class="si">
-      <name>steradian</name>
-      <printSymbol>sr</printSymbol>
-      <property>solid angle</property>
-      <value Unit="rad2" UNIT="RAD2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Hz" CODE="HZ" isMetric="yes" class="si">
-      <name>Hertz</name>
-      <printSymbol>Hz</printSymbol>
-      <property>frequency</property>
-      <value Unit="s-1" UNIT="S-1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="N" CODE="N" isMetric="yes" class="si">
-      <name>Newton</name>
-      <printSymbol>N</printSymbol>
-      <property>force</property>
-      <value Unit="kg.m/s2" UNIT="KG.M/S2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Pa" CODE="PAL" isMetric="yes" class="si">
-      <name>Pascal</name>
-      <printSymbol>Pa</printSymbol>
-      <property>pressure</property>
-      <value Unit="N/m2" UNIT="N/M2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="J" CODE="J" isMetric="yes" class="si">
-      <name>Joule</name>
-      <printSymbol>J</printSymbol>
-      <property>energy</property>
-      <value Unit="N.m" UNIT="N.M" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="W" CODE="W" isMetric="yes" class="si">
-      <name>Watt</name>
-      <printSymbol>W</printSymbol>
-      <property>power</property>
-      <value Unit="J/s" UNIT="J/S" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="A" CODE="A" isMetric="yes" class="si">
-      <name>Amp&#232;re</name>
-      <printSymbol>A</printSymbol>
-      <property>electric current</property>
-      <value Unit="C/s" UNIT="C/S" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="V" CODE="V" isMetric="yes" class="si">
-      <name>Volt</name>
-      <printSymbol>V</printSymbol>
-      <property>electric potential</property>
-      <value Unit="J/C" UNIT="J/C" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="F" CODE="F" isMetric="yes" class="si">
-      <name>Farad</name>
-      <printSymbol>F</printSymbol>
-      <property>electric capacitance</property>
-      <value Unit="C/V" UNIT="C/V" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Ohm" CODE="OHM" isMetric="yes" class="si">
-      <name>Ohm</name>
-      <printSymbol>&#937;</printSymbol>
-      <property>electric resistance</property>
-      <value Unit="V/A" UNIT="V/A" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="S" CODE="SIE" isMetric="yes" class="si">
-      <name>Siemens</name>
-      <printSymbol>S</printSymbol>
-      <property>electric conductance</property>
-      <value Unit="Ohm-1" UNIT="OHM-1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Wb" CODE="WB" isMetric="yes" class="si">
-      <name>Weber</name>
-      <printSymbol>Wb</printSymbol>
-      <property>magentic flux</property>
-      <value Unit="V.s" UNIT="V.S" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Cel" CODE="CEL" isMetric="yes" isSpecial="yes" class="si">
-      <name>degree Celsius</name>
-      <printSymbol>&#176;C</printSymbol>
-      <property>temperature</property>
-      <value Unit="cel(1 K)" UNIT="CEL(1 K)">
-         <function name="Cel" value="1" Unit="K"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="T" CODE="T" isMetric="yes" class="si">
-      <name>Tesla</name>
-      <printSymbol>T</printSymbol>
-      <property>magnetic flux density</property>
-      <value Unit="Wb/m2" UNIT="WB/M2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="H" CODE="H" isMetric="yes" class="si">
-      <name>Henry</name>
-      <printSymbol>H</printSymbol>
-      <property>inductance</property>
-      <value Unit="Wb/A" UNIT="WB/A" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="lm" CODE="LM" isMetric="yes" class="si">
-      <name>lumen</name>
-      <printSymbol>lm</printSymbol>
-      <property>luminous flux</property>
-      <value Unit="cd.sr" UNIT="CD.SR" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="lx" CODE="LX" isMetric="yes" class="si">
-      <name>lux</name>
-      <printSymbol>lx</printSymbol>
-      <property>illuminance</property>
-      <value Unit="lm/m2" UNIT="LM/M2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Bq" CODE="BQ" isMetric="yes" class="si">
-      <name>Becquerel</name>
-      <printSymbol>Bq</printSymbol>
-      <property>radioactivity</property>
-      <value Unit="s-1" UNIT="S-1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Gy" CODE="GY" isMetric="yes" class="si">
-      <name>Gray</name>
-      <printSymbol>Gy</printSymbol>
-      <property>energy dose</property>
-      <value Unit="J/kg" UNIT="J/KG" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Sv" CODE="SV" isMetric="yes" class="si">
-      <name>Sievert</name>
-      <printSymbol>Sv</printSymbol>
-      <property>dose equivalent</property>
-      <value Unit="J/kg" UNIT="J/KG" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="gon" CODE="GON" isMetric="no" class="iso1000">
-      <name>gon</name>
-      <name>grade</name>
-      <printSymbol>&#9633;<sup>g</sup>
-      </printSymbol>
-      <property>plane angle</property>
-      <value Unit="deg" UNIT="DEG" value="0.9">0.9</value>
-   </unit>
-   <unit xmlns="" Code="deg" CODE="DEG" isMetric="no" class="iso1000">
-      <name>degree</name>
-      <printSymbol>&#176;</printSymbol>
-      <property>plane angle</property>
-      <value Unit="[pi].rad/360" UNIT="[PI].RAD/360" value="2">2</value>
-   </unit>
-   <unit xmlns="" Code="'" CODE="'" isMetric="no" class="iso1000">
-      <name>minute</name>
-      <printSymbol>'</printSymbol>
-      <property>plane angle</property>
-      <value Unit="deg/60" UNIT="DEG/60" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="''" CODE="''" isMetric="no" class="iso1000">
-      <name>second</name>
-      <printSymbol>''</printSymbol>
-      <property>plane angle</property>
-      <value Unit="'/60" UNIT="'/60" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="l" CODE="L" isMetric="yes" class="iso1000">
-      <name>liter</name>
-      <printSymbol>l</printSymbol>
-      <property>volume</property>
-      <value Unit="dm3" UNIT="DM3" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="L" isMetric="yes" class="iso1000">
-      <name>liter</name>
-      <printSymbol>L</printSymbol>
-      <property>volume</property>
-      <value Unit="l" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="ar" CODE="AR" isMetric="yes" class="iso1000">
-      <name>are</name>
-      <printSymbol>a</printSymbol>
-      <property>area</property>
-      <value Unit="m2" UNIT="M2" value="100">100</value>
-   </unit>
-   <unit xmlns="" Code="min" CODE="MIN" isMetric="no" class="iso1000">
-      <name>minute</name>
-      <printSymbol>min</printSymbol>
-      <property>time</property>
-      <value Unit="s" UNIT="S" value="60">60</value>
-   </unit>
-   <unit xmlns="" Code="h" CODE="HR" isMetric="no" class="iso1000">
-      <name>hour</name>
-      <printSymbol>h</printSymbol>
-      <property>time</property>
-      <value Unit="min" UNIT="MIN" value="60">60</value>
-   </unit>
-   <unit xmlns="" Code="d" CODE="D" isMetric="no" class="iso1000">
-      <name>day</name>
-      <printSymbol>d</printSymbol>
-      <property>time</property>
-      <value Unit="h" UNIT="HR" value="24">24</value>
-   </unit>
-   <unit xmlns="" Code="a_t" CODE="ANN_T" isMetric="no" class="iso1000">
-      <name>tropical year</name>
-      <printSymbol>a<sub>t</sub>
-      </printSymbol>
-      <property>time</property>
-      <value Unit="d" UNIT="D" value="365.24219">365.24219</value>
-   </unit>
-   <unit xmlns="" Code="a_j" CODE="ANN_J" isMetric="no" class="iso1000">
-      <name>mean Julian year</name>
-      <printSymbol>a<sub>j</sub>
-      </printSymbol>
-      <property>time</property>
-      <value Unit="d" UNIT="D" value="365.25">365.25</value>
-   </unit>
-   <unit xmlns="" Code="a_g" CODE="ANN_G" isMetric="no" class="iso1000">
-      <name>mean Gregorian year</name>
-      <printSymbol>a<sub>g</sub>
-      </printSymbol>
-      <property>time</property>
-      <value Unit="d" UNIT="D" value="365.2425">365.2425</value>
-   </unit>
-   <unit xmlns="" Code="a" CODE="ANN" isMetric="no" class="iso1000">
-      <name>year</name>
-      <printSymbol>a</printSymbol>
-      <property>time</property>
-      <value Unit="a_j" UNIT="ANN_J" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="wk" CODE="WK" isMetric="no" class="iso1000">
-      <name>week</name>
-      <printSymbol>wk</printSymbol>
-      <property>time</property>
-      <value Unit="d" UNIT="D" value="7">7</value>
-   </unit>
-   <unit xmlns="" Code="mo_s" CODE="MO_S" isMetric="no" class="iso1000">
-      <name>synodal month</name>
-      <printSymbol>mo<sub>s</sub>
-      </printSymbol>
-      <property>time</property>
-      <value Unit="d" UNIT="D" value="29.53059">29.53059</value>
-   </unit>
-   <unit xmlns="" Code="mo_j" CODE="MO_J" isMetric="no" class="iso1000">
-      <name>mean Julian month</name>
-      <printSymbol>mo<sub>j</sub>
-      </printSymbol>
-      <property>time</property>
-      <value Unit="a_j/12" UNIT="ANN_J/12" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="mo_g" CODE="MO_G" isMetric="no" class="iso1000">
-      <name>mean Gregorian month</name>
-      <printSymbol>mo<sub>g</sub>
-      </printSymbol>
-      <property>time</property>
-      <value Unit="a_g/12" UNIT="ANN_G/12" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="mo" CODE="MO" isMetric="no" class="iso1000">
-      <name>month</name>
-      <printSymbol>mo</printSymbol>
-      <property>time</property>
-      <value Unit="mo_j" UNIT="MO_J" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="t" CODE="TNE" isMetric="yes" class="iso1000">
-      <name>tonne</name>
-      <printSymbol>t</printSymbol>
-      <property>mass</property>
-      <value Unit="kg" UNIT="KG" value="1e3">1 &#215; 10<sup>3</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="bar" CODE="BAR" isMetric="yes" class="iso1000">
-      <name>bar</name>
-      <printSymbol>bar</printSymbol>
-      <property>pressure</property>
-      <value Unit="Pa" UNIT="PAL" value="1e5">1 &#215; 10<sup>5</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="u" CODE="AMU" isMetric="yes" class="iso1000">
-      <name>unified atomic mass unit</name>
-      <printSymbol>u</printSymbol>
-      <property>mass</property>
-      <value Unit="g" UNIT="G" value="1.6605402e-24">1.6605402 &#215; 10<sup>-24</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="eV" CODE="EV" isMetric="yes" class="iso1000">
-      <name>electronvolt</name>
-      <printSymbol>eV</printSymbol>
-      <property>energy</property>
-      <value Unit="[e].V" UNIT="[E].V" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="AU" CODE="ASU" isMetric="no" class="iso1000">
-      <name>astronomic unit</name>
-      <printSymbol>AU</printSymbol>
-      <property>length</property>
-      <value Unit="Mm" UNIT="MAM" value="149597.870691">149597.870691</value>
-   </unit>
-   <unit xmlns="" Code="pc" CODE="PRS" isMetric="yes" class="iso1000">
-      <name>parsec</name>
-      <printSymbol>pc</printSymbol>
-      <property>length</property>
-      <value Unit="m" UNIT="M" value="3.085678e16">3.085678 &#215; 10<sup>16</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[c]" CODE="[C]" isMetric="yes" class="const">
-      <name>velocity of light</name>
-      <printSymbol>
-         <i>c</i>
-      </printSymbol>
-      <property>velocity</property>
-      <value Unit="m/s" UNIT="M/S" value="299792458">299792458</value>
-   </unit>
-   <unit xmlns="" Code="[h]" CODE="[H]" isMetric="yes" class="const">
-      <name>Planck constant</name>
-      <printSymbol>
-         <i>h</i>
-      </printSymbol>
-      <property>action</property>
-      <value Unit="J.s" UNIT="J.S" value="6.6260755e-24">6.6260755 &#215; 10<sup>-24</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[k]" CODE="[K]" isMetric="yes" class="const">
-      <name>Boltzmann constant</name>
-      <printSymbol>
-         <i>k</i>
-      </printSymbol>
-      <property>(unclassified)</property>
-      <value Unit="J/K" UNIT="J/K" value="1.380658e-23">1.380658 &#215; 10<sup>-23</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[eps_0]" CODE="[EPS_0]" isMetric="yes" class="const">
-      <name>permittivity of vacuum</name>
-      <printSymbol>
-         <i>&#949;<sub>
-               <r>0</r>
-            </sub>
-         </i>
-      </printSymbol>
-      <property>electric permittivity</property>
-      <value Unit="F/m" UNIT="F/M" value="8.854187817e-12">8.854187817 &#215; 10<sup>-12</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[mu_0]" CODE="[MU_0]" isMetric="yes" class="const">
-      <name>permeability of vacuum</name>
-      <printSymbol>
-         <i>&#956;<sub>
-               <r>0</r>
-            </sub>
-         </i>
-      </printSymbol>
-      <property>magnetic permeability</property>
-      <value Unit="4.[pi].10*-7.N/A2" UNIT="4.[PI].10*-7.N/A2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[e]" CODE="[E]" isMetric="yes" class="const">
-      <name>elementary charge</name>
-      <printSymbol>
-         <i>e</i>
-      </printSymbol>
-      <property>electric charge</property>
-      <value Unit="C" UNIT="C" value="1.60217733e-19">1.60217733 &#215; 10<sup>-19</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[m_e]" CODE="[M_E]" isMetric="yes" class="const">
-      <name>electron mass</name>
-      <printSymbol>
-         <i>m<sub>
-               <r>e</r>
-            </sub>
-         </i>
-      </printSymbol>
-      <property>mass</property>
-      <value Unit="g" UNIT="g" value="9.1093897e-28">9.1093897 &#215; 10<sup>-28</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[m_p]" CODE="[M_P]" isMetric="yes" class="const">
-      <name>proton mass</name>
-      <printSymbol>
-         <i>m<sub>
-               <r>p</r>
-            </sub>
-         </i>
-      </printSymbol>
-      <property>mass</property>
-      <value Unit="g" UNIT="g" value="1.6726231e-24">1.6726231 &#215; 10<sup>-24</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[G]" CODE="[GC]" isMetric="yes" class="const">
-      <name>Newtonian constant of gravitation</name>
-      <printSymbol>
-         <i>G</i>
-      </printSymbol>
-      <property>(unclassified)</property>
-      <value Unit="m3.kg-1.s-2" UNIT="M3.KG-1.S-2" value="6.67259e-11">6.67259 &#215; 10<sup>-11</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[g]" CODE="[G]" isMetric="yes" class="const">
-      <name>standard acceleration of free fall</name>
-      <printSymbol>
-         <i>g<sub>n</sub>
-         </i>
-      </printSymbol>
-      <property>acceleration</property>
-      <value Unit="m/s2" UNIT="M/S2" value="980665e-5">9.80665</value>
-   </unit>
-   <unit xmlns="" Code="atm" CODE="ATM" isMetric="no" class="const">
-      <name>standard atmosphere</name>
-      <printSymbol>atm</printSymbol>
-      <property>pressure</property>
-      <value Unit="Pa" UNIT="PAL" value="101325">101325</value>
-   </unit>
-   <unit xmlns="" Code="[ly]" CODE="[LY]" isMetric="yes" class="const">
-      <name>light-year</name>
-      <printSymbol>l.y.</printSymbol>
-      <property>length</property>
-      <value Unit="[c].a_j" UNIT="[C].ANN_J" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="gf" CODE="GF" isMetric="yes" class="const">
-      <name>gram-force</name>
-      <printSymbol>gf</printSymbol>
-      <property>force</property>
-      <value Unit="g.[g]" UNIT="G.[G]" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[lbf_av]" CODE="[LBF_AV]" isMetric="no" class="const">
-      <name>pound force</name>
-      <printSymbol>lbf</printSymbol>
-      <property>force</property>
-      <value Unit="[lb_av].[g]" UNIT="[LB_AV].[G]" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Ky" CODE="KY" isMetric="yes" class="cgs">
-      <name>Kayser</name>
-      <printSymbol>K</printSymbol>
-      <property>lineic number</property>
-      <value Unit="cm-1" UNIT="CM-1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Gal" CODE="GL" isMetric="yes" class="cgs">
-      <name>Gal</name>
-      <printSymbol>Gal</printSymbol>
-      <property>acceleration</property>
-      <value Unit="cm/s2" UNIT="CM/S2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="dyn" CODE="DYN" isMetric="yes" class="cgs">
-      <name>dyne</name>
-      <printSymbol>dyn</printSymbol>
-      <property>force</property>
-      <value Unit="g.cm/s2" UNIT="G.CM/S2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="erg" CODE="ERG" isMetric="yes" class="cgs">
-      <name>erg</name>
-      <printSymbol>erg</printSymbol>
-      <property>energy</property>
-      <value Unit="dyn.cm" UNIT="DYN.CM" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="P" CODE="P" isMetric="yes" class="cgs">
-      <name>Poise</name>
-      <printSymbol>P</printSymbol>
-      <property>dynamic viscosity</property>
-      <value Unit="dyn.s/cm2" UNIT="DYN.S/CM2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Bi" CODE="BI" isMetric="yes" class="cgs">
-      <name>Biot</name>
-      <printSymbol>Bi</printSymbol>
-      <property>electric current</property>
-      <value Unit="A" UNIT="A" value="10">10</value>
-   </unit>
-   <unit xmlns="" Code="St" CODE="ST" isMetric="yes" class="cgs">
-      <name>Stokes</name>
-      <printSymbol>St</printSymbol>
-      <property>kinematic viscosity</property>
-      <value Unit="cm2/s" UNIT="CM2/S" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Mx" CODE="MX" isMetric="yes" class="cgs">
-      <name>Maxwell</name>
-      <printSymbol>Mx</printSymbol>
-      <property>flux of magnetic induction</property>
-      <value Unit="Wb" UNIT="WB" value="1e-8">1 &#215; 10<sup>-8</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="G" CODE="GS" isMetric="yes" class="cgs">
-      <name>Gauss</name>
-      <printSymbol>Gs</printSymbol>
-      <property>magnetic flux density</property>
-      <value Unit="T" UNIT="T" value="1e-4">1 &#215; 10<sup>-4</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="Oe" CODE="OE" isMetric="yes" class="cgs">
-      <name>Oersted</name>
-      <printSymbol>Oe</printSymbol>
-      <property>magnetic field intensity</property>
-      <value Unit="/[pi].A/m" UNIT="/[PI].A/M" value="250">250</value>
-   </unit>
-   <unit xmlns="" Code="Gb" CODE="GB" isMetric="yes" class="cgs">
-      <name>Gilbert</name>
-      <printSymbol>Gb</printSymbol>
-      <property>magnetic tension</property>
-      <value Unit="Oe.cm" UNIT="OE.CM" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="sb" CODE="SB" isMetric="yes" class="cgs">
-      <name>stilb</name>
-      <printSymbol>sb</printSymbol>
-      <property>lum. intensity density</property>
-      <value Unit="cd/cm2" UNIT="CD/CM2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Lmb" CODE="LMB" isMetric="yes" class="cgs">
-      <name>Lambert</name>
-      <printSymbol>L</printSymbol>
-      <property>brightness</property>
-      <value Unit="cd/cm2/[pi]" UNIT="CD/CM2/[PI]" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="ph" CODE="PHT" isMetric="yes" class="cgs">
-      <name>phot</name>
-      <printSymbol>ph</printSymbol>
-      <property>illuminance</property>
-      <value Unit="lx" UNIT="LX" value="1e-4">1 &#215; 10<sup>-4</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="Ci" CODE="CI" isMetric="yes" class="cgs">
-      <name>Curie</name>
-      <printSymbol>Ci</printSymbol>
-      <property>radioactivity</property>
-      <value Unit="Bq" UNIT="BQ" value="37e9">3.7 &#215; 10<sup>10</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="R" CODE="ROE" isMetric="yes" class="cgs">
-      <name>Roentgen</name>
-      <printSymbol>R</printSymbol>
-      <property>ion dose</property>
-      <value Unit="C/kg" UNIT="C/KG" value="2.58e-4">2.58 &#215; 10<sup>-4</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="RAD" CODE="[RAD]" isMetric="yes" class="cgs">
-      <name>radiation absorbed dose</name>
-      <printSymbol>RAD</printSymbol>
-      <property>energy dose</property>
-      <value Unit="erg/g" UNIT="ERG/G" value="100">100</value>
-   </unit>
-   <unit xmlns="" Code="REM" CODE="[REM]" isMetric="yes" class="cgs">
-      <name>radiation equivalent man</name>
-      <printSymbol>REM</printSymbol>
-      <property>dose equivalent</property>
-      <value Unit="RAD" UNIT="[RAD]" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[in_i]" CODE="[IN_I]" isMetric="no" class="intcust">
-      <name>inch</name>
-      <printSymbol>in</printSymbol>
-      <property>length</property>
-      <value Unit="cm" UNIT="CM" value="254e-2">2.54</value>
-   </unit>
-   <unit xmlns="" Code="[ft_i]" CODE="[FT_I]" isMetric="no" class="intcust">
-      <name>foot</name>
-      <printSymbol>ft</printSymbol>
-      <property>length</property>
-      <value Unit="[in_i]" UNIT="[IN_I]" value="12">12</value>
-   </unit>
-   <unit xmlns="" Code="[yd_i]" CODE="[YD_I]" isMetric="no" class="intcust">
-      <name>yard</name>
-      <printSymbol>yd</printSymbol>
-      <property>length</property>
-      <value Unit="[ft_i]" UNIT="[FT_I]" value="3">3</value>
-   </unit>
-   <unit xmlns="" Code="[mi_i]" CODE="[MI_I]" isMetric="no" class="intcust">
-      <name>statute mile</name>
-      <printSymbol>mi</printSymbol>
-      <property>length</property>
-      <value Unit="[ft_i]" UNIT="[FT_I]" value="5280">5280</value>
-   </unit>
-   <unit xmlns="" Code="[fth_i]" CODE="[FTH_I]" isMetric="no" class="intcust">
-      <name>fathom</name>
-      <printSymbol>fth</printSymbol>
-      <property>depth of water</property>
-      <value Unit="[ft_i]" UNIT="[FT_I]" value="6">6</value>
-   </unit>
-   <unit xmlns="" Code="[nmi_i]" CODE="[NMI_I]" isMetric="no" class="intcust">
-      <name>nautical mile</name>
-      <printSymbol>n.mi</printSymbol>
-      <property>length</property>
-      <value Unit="m" UNIT="M" value="1852">1852</value>
-   </unit>
-   <unit xmlns="" Code="[kn_i]" CODE="[KN_I]" isMetric="no" class="intcust">
-      <name>knot</name>
-      <printSymbol>knot</printSymbol>
-      <property>velocity</property>
-      <value Unit="[nmi_i]/h" UNIT="[NMI_I]/H" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[sin_i]" CODE="[SIN_I]" isMetric="no" class="intcust">
-      <name>square inch</name>
-      <property>area</property>
-      <value Unit="[in_i]2" UNIT="[IN_I]2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[sft_i]" CODE="[SFT_I]" isMetric="no" class="intcust">
-      <name>square foot</name>
-      <property>area</property>
-      <value Unit="[ft_i]2" UNIT="[FT_I]2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[syd_i]" CODE="[SYD_I]" isMetric="no" class="intcust">
-      <name>square yard</name>
-      <property>area</property>
-      <value Unit="[yd_i]2" UNIT="[YD_I]2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[cin_i]" CODE="[CIN_I]" isMetric="no" class="intcust">
-      <name>cubic inch</name>
-      <property>volume</property>
-      <value Unit="[in_i]3" UNIT="[IN_I]3" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[cft_i]" CODE="[CFT_I]" isMetric="no" class="intcust">
-      <name>cubic foot</name>
-      <property>volume</property>
-      <value Unit="[ft_i]3" UNIT="[FT_I]3" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[cyd_i]" CODE="[CYD_I]" isMetric="no" class="intcust">
-      <name>cubic yard</name>
-      <printSymbol>cu.yd</printSymbol>
-      <property>volume</property>
-      <value Unit="[yd_i]3" UNIT="[YD_I]3" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[bf_i]" CODE="[BF_I]" isMetric="no" class="intcust">
-      <name>board foot</name>
-      <property>volume</property>
-      <value Unit="[in_i]3" UNIT="[IN_I]3" value="144">144</value>
-   </unit>
-   <unit xmlns="" Code="[cr_i]" CODE="[CR_I]" isMetric="no" class="intcust">
-      <name>cord</name>
-      <property>volume</property>
-      <value Unit="[ft_i]3" UNIT="[FT_I]3" value="128">128</value>
-   </unit>
-   <unit xmlns="" Code="[mil_i]" CODE="[MIL_I]" isMetric="no" class="intcust">
-      <name>mil</name>
-      <printSymbol>mil</printSymbol>
-      <property>length</property>
-      <value Unit="[in_i]" UNIT="[IN_I]" value="1e-3">1 &#215; 10<sup>-3</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[cml_i]" CODE="[CML_I]" isMetric="no" class="intcust">
-      <name>circular mil</name>
-      <printSymbol>circ.mil</printSymbol>
-      <property>area</property>
-      <value Unit="[pi]/4.[mil_i]2" UNIT="[PI]/4.[MIL_I]2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[hd_i]" CODE="[HD_I]" isMetric="no" class="intcust">
-      <name>hand</name>
-      <printSymbol>hd</printSymbol>
-      <property>height of horses</property>
-      <value Unit="[in_i]" UNIT="[IN_I]" value="4">4</value>
-   </unit>
-   <unit xmlns="" Code="[ft_us]" CODE="[FT_US]" isMetric="no" class="us-lengths">
-      <name>foot</name>
-      <printSymbol>ft<sub>us</sub>
-      </printSymbol>
-      <property>length</property>
-      <value Unit="m/3937" UNIT="M/3937" value="1200">1200</value>
-   </unit>
-   <unit xmlns="" Code="[yd_us]" CODE="[YD_US]" isMetric="no" class="us-lengths">
-      <name>yard</name>
-      <property>length</property>
-      <value Unit="[ft_us]" UNIT="[FT_US]" value="3">3</value>
-   </unit>
-   <unit xmlns="" Code="[in_us]" CODE="[IN_US]" isMetric="no" class="us-lengths">
-      <name>inch</name>
-      <property>length</property>
-      <value Unit="[ft_us]/12" UNIT="[FT_US]/12" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[rd_us]" CODE="[RD_US]" isMetric="no" class="us-lengths">
-      <name>rod</name>
-      <property>length</property>
-      <value Unit="[ft_us]" UNIT="[FT_US]" value="16.5">16.5</value>
-   </unit>
-   <unit xmlns="" Code="[ch_us]" CODE="[CH_US]" isMetric="no" class="us-lengths">
-      <name>Gunter's chain</name>
-      <name>Surveyor's chain</name>
-      <property>length</property>
-      <value Unit="[rd_us]" UNIT="[RD_US]" value="4">4</value>
-   </unit>
-   <unit xmlns="" Code="[lk_us]" CODE="[LK_US]" isMetric="no" class="us-lengths">
-      <name>link for Gunter's chain</name>
-      <property>length</property>
-      <value Unit="[ch_us]/100" UNIT="[CH_US]/100" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[rch_us]" CODE="[RCH_US]" isMetric="no" class="us-lengths">
-      <name>Ramden's chain</name>
-      <name>Engineer's chain</name>
-      <property>length</property>
-      <value Unit="[ft_us]" UNIT="[FT_US]" value="100">100</value>
-   </unit>
-   <unit xmlns="" Code="[rlk_us]" CODE="[RLK_US]" isMetric="no" class="us-lengths">
-      <name>link for Ramden's chain</name>
-      <property>length</property>
-      <value Unit="[rch_us]/100" UNIT="[RCH_US]/100" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[fth_us]" CODE="[FTH_US]" isMetric="no" class="us-lengths">
-      <name>fathom</name>
-      <property>length</property>
-      <value Unit="[ft_us]" UNIT="[FT_US]" value="6">6</value>
-   </unit>
-   <unit xmlns="" Code="[fur_us]" CODE="[FUR_US]" isMetric="no" class="us-lengths">
-      <name>furlong</name>
-      <property>length</property>
-      <value Unit="[rd_us]" UNIT="[RD_US]" value="40">40</value>
-   </unit>
-   <unit xmlns="" Code="[mi_us]" CODE="[MI_US]" isMetric="no" class="us-lengths">
-      <name>mile</name>
-      <property>length</property>
-      <value Unit="[fur_us]" UNIT="[FUR_US]" value="8">8</value>
-   </unit>
-   <unit xmlns="" Code="[acr_us]" CODE="[ACR_US]" isMetric="no" class="us-lengths">
-      <name>acre</name>
-      <property>area</property>
-      <value Unit="[rd_us]2" UNIT="[RD_US]2" value="160">160</value>
-   </unit>
-   <unit xmlns="" Code="[srd_us]" CODE="[SRD_US]" isMetric="no" class="us-lengths">
-      <name>square rod</name>
-      <property>area</property>
-      <value Unit="[rd_us]2" UNIT="[RD_US]2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[smi_us]" CODE="[SMI_US]" isMetric="no" class="us-lengths">
-      <name>square mile</name>
-      <property>area</property>
-      <value Unit="[mi_us]2" UNIT="[MI_US]2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[sct]" CODE="[SCT]" isMetric="no" class="us-lengths">
-      <name>section</name>
-      <property>area</property>
-      <value Unit="[mi_us]2" UNIT="[MI_US]2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[twp]" CODE="[TWP]" isMetric="no" class="us-lengths">
-      <name>township</name>
-      <property>area</property>
-      <value Unit="[sct]" UNIT="[SCT]" value="36">36</value>
-   </unit>
-   <unit xmlns="" Code="[mil_us]" CODE="[MIL_US]" isMetric="no" class="us-lengths">
-      <name>mil</name>
-      <property>length</property>
-      <value Unit="[in_us]" UNIT="[IN_US]" value="1e-3">1 &#215; 10<sup>-3</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[in_br]" CODE="[IN_BR]" isMetric="no" class="brit-length">
-      <name>inch</name>
-      <property>length</property>
-      <value Unit="cm" UNIT="CM" value="2.539998">2.539998</value>
-   </unit>
-   <unit xmlns="" Code="[ft_br]" CODE="[FT_BR]" isMetric="no" class="brit-length">
-      <name>foot</name>
-      <property>length</property>
-      <value Unit="[in_br]" UNIT="[IN_BR]" value="12">12</value>
-   </unit>
-   <unit xmlns="" Code="[rd_br]" CODE="[RD_BR]" isMetric="no" class="brit-length">
-      <name>rod</name>
-      <property>length</property>
-      <value Unit="[ft_br]" UNIT="[FT_BR]" value="16.5">16.5</value>
-   </unit>
-   <unit xmlns="" Code="[ch_br]" CODE="[CH_BR]" isMetric="no" class="brit-length">
-      <name>Gunter's chain</name>
-      <property>length</property>
-      <value Unit="[rd_br]" UNIT="[RD_BR]" value="4">4</value>
-   </unit>
-   <unit xmlns="" Code="[lk_br]" CODE="[LK_BR]" isMetric="no" class="brit-length">
-      <name>link for Gunter's chain</name>
-      <property>length</property>
-      <value Unit="[ch_br]/100" UNIT="[CH_BR]/100" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[fth_br]" CODE="[FTH_BR]" isMetric="no" class="brit-length">
-      <name>fathom</name>
-      <property>length</property>
-      <value Unit="[ft_br]" UNIT="[FT_BR]" value="6">6</value>
-   </unit>
-   <unit xmlns="" Code="[pc_br]" CODE="[PC_BR]" isMetric="no" class="brit-length">
-      <name>pace</name>
-      <property>length</property>
-      <value Unit="[ft_br]" UNIT="[FT_BR]" value="2.5">2.5</value>
-   </unit>
-   <unit xmlns="" Code="[yd_br]" CODE="[YD_BR]" isMetric="no" class="brit-length">
-      <name>yard</name>
-      <property>length</property>
-      <value Unit="[ft_br]" UNIT="[FT_BR]" value="3">3</value>
-   </unit>
-   <unit xmlns="" Code="[mi_br]" CODE="[MI_BR]" isMetric="no" class="brit-length">
-      <name>mile</name>
-      <property>length</property>
-      <value Unit="[ft_br]" UNIT="[FT_BR]" value="5280">5280</value>
-   </unit>
-   <unit xmlns="" Code="[nmi_br]" CODE="[NMI_BR]" isMetric="no" class="brit-length">
-      <name>nautical mile</name>
-      <property>length</property>
-      <value Unit="[ft_br]" UNIT="[FT_BR]" value="6080">6080</value>
-   </unit>
-   <unit xmlns="" Code="[kn_br]" CODE="[KN_BR]" isMetric="no" class="brit-length">
-      <name>knot</name>
-      <property>velocity</property>
-      <value Unit="[nmi_br]/h" UNIT="[NMI_BR]/H" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[acr_br]" CODE="[ACR_BR]" isMetric="no" class="brit-length">
-      <name>acre</name>
-      <property>area</property>
-      <value Unit="[yd_br]2" UNIT="[YD_BR]2" value="4840">4840</value>
-   </unit>
-   <unit xmlns="" Code="[gal_us]" CODE="[GAL_US]" isMetric="no" class="us-volumes">
-      <name>Queen&#160;Anne's wine gallon</name>
-      <property>fluid volume</property>
-      <value Unit="[in_i]3" UNIT="[IN_I]3" value="231">231</value>
-   </unit>
-   <unit xmlns="" Code="[bbl_us]" CODE="[BBL_US]" isMetric="no" class="us-volumes">
-      <name>barrel</name>
-      <property>fluid volume</property>
-      <value Unit="[gal_us]" UNIT="[GAL_US]" value="42">42</value>
-   </unit>
-   <unit xmlns="" Code="[qt_us]" CODE="[QT_US]" isMetric="no" class="us-volumes">
-      <name>quart</name>
-      <property>fluid volume</property>
-      <value Unit="[gal_us]/4" UNIT="[GAL_US]/4" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[pt_us]" CODE="[PT_US]" isMetric="no" class="us-volumes">
-      <name>pint</name>
-      <property>fluid volume</property>
-      <value Unit="[qt_us]/2" UNIT="[QT_US]/2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[gil_us]" CODE="[GIL_US]" isMetric="no" class="us-volumes">
-      <name>gill</name>
-      <property>fluid volume</property>
-      <value Unit="[pt_us]/4" UNIT="[PT_US]/4" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[foz_us]" CODE="[FOZ_US]" isMetric="no" class="us-volumes">
-      <name>fluid ounce</name>
-      <printSymbol>oz fl</printSymbol>
-      <property>fluid volume</property>
-      <value Unit="[gil_us]/4" UNIT="[GIL_US]/4" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[fdr_us]" CODE="[FDR_US]" isMetric="no" class="us-volumes">
-      <name>fluid dram</name>
-      <property>fluid volume</property>
-      <value Unit="[foz_us]/8" UNIT="[FOZ_US]/8" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[min_us]" CODE="[MIN_US]" isMetric="no" class="us-volumes">
-      <name>minim</name>
-      <property>fluid volume</property>
-      <value Unit="[fdr_us]/60" UNIT="[FDR_US]/60" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[crd_us]" CODE="[CRD_US]" isMetric="no" class="us-volumes">
-      <name>cord</name>
-      <property>fluid volume</property>
-      <value Unit="[ft_i]3" UNIT="[FT_I]3" value="128">128</value>
-   </unit>
-   <unit xmlns="" Code="[bu_us]" CODE="[BU_US]" isMetric="no" class="us-volumes">
-      <name>bushel</name>
-      <property>dry volume</property>
-      <value Unit="[in_i]3" UNIT="[IN_I]3" value="2150.42">2150.42</value>
-   </unit>
-   <unit xmlns="" Code="[gal_wi]" CODE="[GAL_WI]" isMetric="no" class="us-volumes">
-      <name>historical winchester gallon</name>
-      <property>dry volume</property>
-      <value Unit="[bu_us]/8" UNIT="[BU_US]/8" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[pk_us]" CODE="[PK_US]" isMetric="no" class="us-volumes">
-      <name>peck</name>
-      <property>dry volume</property>
-      <value Unit="[bu_us]/4" UNIT="[BU_US]/4" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[dqt_us]" CODE="[DQT_US]" isMetric="no" class="us-volumes">
-      <name>dry quart</name>
-      <property>dry volume</property>
-      <value Unit="[pk_us]/8" UNIT="[PK_US]/8" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[dpt_us]" CODE="[DPT_US]" isMetric="no" class="us-volumes">
-      <name>dry pint</name>
-      <property>dry volume</property>
-      <value Unit="[dqt_us]/2" UNIT="[DQT_US]/2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[tbs_us]" CODE="[TBS_US]" isMetric="no" class="us-volumes">
-      <name>tablespoon</name>
-      <property>volume</property>
-      <value Unit="[foz_us]/2" UNIT="[FOZ_US]/2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[tsp_us]" CODE="[TSP_US]" isMetric="no" class="us-volumes">
-      <name>teaspoon</name>
-      <property>volume</property>
-      <value Unit="[tbs_us]/3" UNIT="[TBS_US]/3" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[cup_us]" CODE="[CUP_US]" isMetric="no" class="us-volumes">
-      <name>cup</name>
-      <property>volume</property>
-      <value Unit="[tbs_us]" UNIT="[TBS_US]" value="16">16</value>
-   </unit>
-   <unit xmlns="" Code="[foz_m]" CODE="[FOZ_M]" isMetric="no" class="us-volumes">
-      <name>metric fluid ounce</name>
-      <printSymbol>oz fl</printSymbol>
-      <property>fluid volume</property>
-      <value Unit="mL" UNIT="ML" value="30">30</value>
-   </unit>
-   <unit xmlns="" Code="[cup_m]" CODE="[CUP_M]" isMetric="no" class="us-volumes">
-      <name>metric cup</name>
-      <property>volume</property>
-      <value Unit="mL" UNIT="ML" value="240">240</value>
-   </unit>
-   <unit xmlns="" Code="[tsp_m]" CODE="[TSP_M]" isMetric="no" class="us-volumes">
-      <name>metric teaspoon</name>
-      <property>volume</property>
-      <value Unit="mL" UNIT="mL" value="5">5</value>
-   </unit>
-   <unit xmlns="" Code="[tbs_m]" CODE="[TBS_M]" isMetric="no" class="us-volumes">
-      <name>metric tablespoon</name>
-      <property>volume</property>
-      <value Unit="mL" UNIT="mL" value="15">15</value>
-   </unit>
-   <unit xmlns="" Code="[gal_br]" CODE="[GAL_BR]" isMetric="no" class="brit-volumes">
-      <name>gallon</name>
-      <property>volume</property>
-      <value Unit="l" UNIT="L" value="4.54609">4.54609</value>
-   </unit>
-   <unit xmlns="" Code="[pk_br]" CODE="[PK_BR]" isMetric="no" class="brit-volumes">
-      <name>peck</name>
-      <property>volume</property>
-      <value Unit="[gal_br]" UNIT="[GAL_BR]" value="2">2</value>
-   </unit>
-   <unit xmlns="" Code="[bu_br]" CODE="[BU_BR]" isMetric="no" class="brit-volumes">
-      <name>bushel</name>
-      <property>volume</property>
-      <value Unit="[pk_br]" UNIT="[PK_BR]" value="4">4</value>
-   </unit>
-   <unit xmlns="" Code="[qt_br]" CODE="[QT_BR]" isMetric="no" class="brit-volumes">
-      <name>quart</name>
-      <property>volume</property>
-      <value Unit="[gal_br]/4" UNIT="[GAL_BR]/4" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[pt_br]" CODE="[PT_BR]" isMetric="no" class="brit-volumes">
-      <name>pint</name>
-      <property>volume</property>
-      <value Unit="[qt_br]/2" UNIT="[QT_BR]/2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[gil_br]" CODE="[GIL_BR]" isMetric="no" class="brit-volumes">
-      <name>gill</name>
-      <property>volume</property>
-      <value Unit="[pt_br]/4" UNIT="[PT_BR]/4" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[foz_br]" CODE="[FOZ_BR]" isMetric="no" class="brit-volumes">
-      <name>fluid ounce</name>
-      <property>volume</property>
-      <value Unit="[gil_br]/5" UNIT="[GIL_BR]/5" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[fdr_br]" CODE="[FDR_BR]" isMetric="no" class="brit-volumes">
-      <name>fluid dram</name>
-      <property>volume</property>
-      <value Unit="[foz_br]/8" UNIT="[FOZ_BR]/8" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[min_br]" CODE="[MIN_BR]" isMetric="no" class="brit-volumes">
-      <name>minim</name>
-      <property>volume</property>
-      <value Unit="[fdr_br]/60" UNIT="[FDR_BR]/60" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[gr]" CODE="[GR]" isMetric="no" class="avoirdupois">
-      <name>grain</name>
-      <property>mass</property>
-      <value Unit="mg" UNIT="MG" value="64.79891">64.79891</value>
-   </unit>
-   <unit xmlns="" Code="[lb_av]" CODE="[LB_AV]" isMetric="no" class="avoirdupois">
-      <name>pound</name>
-      <printSymbol>lb</printSymbol>
-      <property>mass</property>
-      <value Unit="[gr]" UNIT="[GR]" value="7000">7000</value>
-   </unit>
-   <unit xmlns="" Code="[oz_av]" CODE="[OZ_AV]" isMetric="no" class="avoirdupois">
-      <name>ounce</name>
-      <printSymbol>oz</printSymbol>
-      <property>mass</property>
-      <value Unit="[lb_av]/16" UNIT="[LB_AV]/16" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[dr_av]" CODE="[DR_AV]" isMetric="no" class="avoirdupois">
-      <name>dram</name>
-      <property>mass</property>
-      <value Unit="[oz_av]/16" UNIT="[OZ_AV]/16" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[scwt_av]" CODE="[SCWT_AV]" isMetric="no" class="avoirdupois">
-      <name>short hundredweight</name>
-      <name>U.S. hundredweight</name>
-      <property>mass</property>
-      <value Unit="[lb_av]" UNIT="[LB_AV]" value="100">100</value>
-   </unit>
-   <unit xmlns="" Code="[lcwt_av]" CODE="[LCWT_AV]" isMetric="no" class="avoirdupois">
-      <name>long hunderdweight</name>
-      <name>British hundredweight</name>
-      <property>mass</property>
-      <value Unit="[lb_av]" UNIT="[LB_AV]" value="112">112</value>
-   </unit>
-   <unit xmlns="" Code="[ston_av]" CODE="[STON_AV]" isMetric="no" class="avoirdupois">
-      <name>short ton</name>
-      <name>U.S. ton</name>
-      <property>mass</property>
-      <value Unit="[scwt_av]" UNIT="[SCWT_AV]" value="20">20</value>
-   </unit>
-   <unit xmlns="" Code="[lton_av]" CODE="[LTON_AV]" isMetric="no" class="avoirdupois">
-      <name>long ton</name>
-      <name>British ton</name>
-      <property>mass</property>
-      <value Unit="[lcwt_av]" UNIT="[LCWT_AV]" value="20">20</value>
-   </unit>
-   <unit xmlns="" Code="[stone_av]" CODE="[STONE_AV]" isMetric="no" class="avoirdupois">
-      <name>stone</name>
-      <name>British stone</name>
-      <property>mass</property>
-      <value Unit="[lb_av]" UNIT="[LB_AV]" value="14">14</value>
-   </unit>
-   <unit xmlns="" Code="[pwt_tr]" CODE="[PWT_TR]" isMetric="no" class="troy">
-      <name>pennyweight</name>
-      <property>mass</property>
-      <value Unit="[gr]" UNIT="[GR]" value="24">24</value>
-   </unit>
-   <unit xmlns="" Code="[oz_tr]" CODE="[OZ_TR]" isMetric="no" class="troy">
-      <name>ounce</name>
-      <property>mass</property>
-      <value Unit="[pwt_tr]" UNIT="[PWT_TR]" value="20">20</value>
-   </unit>
-   <unit xmlns="" Code="[lb_tr]" CODE="[LB_TR]" isMetric="no" class="troy">
-      <name>pound</name>
-      <property>mass</property>
-      <value Unit="[oz_tr]" UNIT="[OZ_TR]" value="12">12</value>
-   </unit>
-   <unit xmlns="" Code="[sc_ap]" CODE="[SC_AP]" isMetric="no" class="apoth">
-      <name>scruple</name>
-      <property>mass</property>
-      <value Unit="[gr]" UNIT="[GR]" value="20">20</value>
-   </unit>
-   <unit xmlns="" Code="[dr_ap]" CODE="[DR_AP]" isMetric="no" class="apoth">
-      <name>dram</name>
-      <name>drachm</name>
-      <property>mass</property>
-      <value Unit="[sc_ap]" UNIT="[SC_AP]" value="3">3</value>
-   </unit>
-   <unit xmlns="" Code="[oz_ap]" CODE="[OZ_AP]" isMetric="no" class="apoth">
-      <name>ounce</name>
-      <property>mass</property>
-      <value Unit="[dr_ap]" UNIT="[DR_AP]" value="8">8</value>
-   </unit>
-   <unit xmlns="" Code="[lb_ap]" CODE="[LB_AP]" isMetric="no" class="apoth">
-      <name>pound</name>
-      <property>mass</property>
-      <value Unit="[oz_ap]" UNIT="[OZ_AP]" value="12">12</value>
-   </unit>
-   <unit xmlns="" Code="[oz_m]" CODE="[OZ_M]" isMetric="no" class="apoth">
-      <name>metric ounce</name>
-      <property>mass</property>
-      <value Unit="g" UNIT="g" value="28">28</value>
-   </unit>
-   <unit xmlns="" Code="[lne]" CODE="[LNE]" isMetric="no" class="typeset">
-      <name>line</name>
-      <property>length</property>
-      <value Unit="[in_i]/12" UNIT="[IN_I]/12" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[pnt]" CODE="[PNT]" isMetric="no" class="typeset">
-      <name>point</name>
-      <property>length</property>
-      <value Unit="[lne]/6" UNIT="[LNE]/6" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[pca]" CODE="[PCA]" isMetric="no" class="typeset">
-      <name>pica</name>
-      <property>length</property>
-      <value Unit="[pnt]" UNIT="[PNT]" value="12">12</value>
-   </unit>
-   <unit xmlns="" Code="[pnt_pr]" CODE="[PNT_PR]" isMetric="no" class="typeset">
-      <name>Printer's point</name>
-      <property>length</property>
-      <value Unit="[in_i]" UNIT="[IN_I]" value="0.013837">0.013837</value>
-   </unit>
-   <unit xmlns="" Code="[pca_pr]" CODE="[PCA_PR]" isMetric="no" class="typeset">
-      <name>Printer's pica</name>
-      <property>length</property>
-      <value Unit="[pnt_pr]" UNIT="[PNT_PR]" value="12">12</value>
-   </unit>
-   <unit xmlns="" Code="[pied]" CODE="[PIED]" isMetric="no" class="typeset">
-      <name>pied</name>
-      <name>French foot</name>
-      <property>length</property>
-      <value Unit="cm" UNIT="CM" value="32.48">32.48</value>
-   </unit>
-   <unit xmlns="" Code="[pouce]" CODE="[POUCE]" isMetric="no" class="typeset">
-      <name>pouce</name>
-      <name>French inch</name>
-      <property>length</property>
-      <value Unit="[pied]/12" UNIT="[PIED]/12" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[ligne]" CODE="[LIGNE]" isMetric="no" class="typeset">
-      <name>ligne</name>
-      <name>French line</name>
-      <property>length</property>
-      <value Unit="[pouce]/12" UNIT="[POUCE]/12" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[didot]" CODE="[DIDOT]" isMetric="no" class="typeset">
-      <name>didot</name>
-      <name>Didot's point</name>
-      <property>length</property>
-      <value Unit="[ligne]/6" UNIT="[LIGNE]/6" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[cicero]" CODE="[CICERO]" isMetric="no" class="typeset">
-      <name>cicero</name>
-      <name>Didot's pica</name>
-      <property>length</property>
-      <value Unit="[didot]" UNIT="[DIDOT]" value="12">12</value>
-   </unit>
-   <unit xmlns="" Code="[degF]" CODE="[DEGF]" isMetric="no" isSpecial="yes" class="heat">
-      <name>degree Fahrenheit</name>
-      <printSymbol>&#176;F</printSymbol>
-      <property>temperature</property>
-      <value Unit="degf(5 K/9)" UNIT="DEGF(5 K/9)">
-         <function name="degF" value="5" Unit="K/9"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[degR]" CODE="[degR]" isMetric="no" class="heat">
-      <name>degree Rankine</name>
-      <printSymbol>&#176;R</printSymbol>
-      <property>temperature</property>
-      <value value="5" Unit="K/9" UNIT="K/9">5</value>
-   </unit>
-   <unit xmlns="" Code="cal_[15]" CODE="CAL_[15]" isMetric="yes" class="heat">
-      <name>calorie at 15&#160;&#176;C</name>
-      <printSymbol>cal<sub>15&#176;C</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="J" UNIT="J" value="4.18580">4.18580</value>
-   </unit>
-   <unit xmlns="" Code="cal_[20]" CODE="CAL_[20]" isMetric="yes" class="heat">
-      <name>calorie at 20&#160;&#176;C</name>
-      <printSymbol>cal<sub>20&#176;C</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="J" UNIT="J" value="4.18190">4.18190</value>
-   </unit>
-   <unit xmlns="" Code="cal_m" CODE="CAL_M" isMetric="yes" class="heat">
-      <name>mean calorie</name>
-      <printSymbol>cal<sub>m</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="J" UNIT="J" value="4.19002">4.19002</value>
-   </unit>
-   <unit xmlns="" Code="cal_IT" CODE="CAL_IT" isMetric="yes" class="heat">
-      <name>international table calorie</name>
-      <printSymbol>cal<sub>IT</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="J" UNIT="J" value="4.1868">4.1868</value>
-   </unit>
-   <unit xmlns="" Code="cal_th" CODE="CAL_TH" isMetric="yes" class="heat">
-      <name>thermochemical calorie</name>
-      <printSymbol>cal<sub>th</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="J" UNIT="J" value="4.184">4.184</value>
-   </unit>
-   <unit xmlns="" Code="cal" CODE="CAL" isMetric="yes" class="heat">
-      <name>calorie</name>
-      <printSymbol>cal</printSymbol>
-      <property>energy</property>
-      <value Unit="cal_th" UNIT="CAL_TH" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[Cal]" CODE="[CAL]" isMetric="no" class="heat">
-      <name>nutrition label Calories</name>
-      <printSymbol>Cal</printSymbol>
-      <property>energy</property>
-      <value Unit="kcal_th" UNIT="KCAL_TH" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[Btu_39]" CODE="[BTU_39]" isMetric="no" class="heat">
-      <name>British thermal unit at 39&#160;&#176;F</name>
-      <printSymbol>Btu<sub>39&#176;F</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="kJ" UNIT="kJ" value="1.05967">1.05967</value>
-   </unit>
-   <unit xmlns="" Code="[Btu_59]" CODE="[BTU_59]" isMetric="no" class="heat">
-      <name>British thermal unit at 59&#160;&#176;F</name>
-      <printSymbol>Btu<sub>59&#176;F</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="kJ" UNIT="kJ" value="1.05480">1.05480</value>
-   </unit>
-   <unit xmlns="" Code="[Btu_60]" CODE="[BTU_60]" isMetric="no" class="heat">
-      <name>British thermal unit at 60&#160;&#176;F</name>
-      <printSymbol>Btu<sub>60&#176;F</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="kJ" UNIT="kJ" value="1.05468">1.05468</value>
-   </unit>
-   <unit xmlns="" Code="[Btu_m]" CODE="[BTU_M]" isMetric="no" class="heat">
-      <name>mean British thermal unit</name>
-      <printSymbol>Btu<sub>m</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="kJ" UNIT="kJ" value="1.05587">1.05587</value>
-   </unit>
-   <unit xmlns="" Code="[Btu_IT]" CODE="[BTU_IT]" isMetric="no" class="heat">
-      <name>international table British thermal unit</name>
-      <printSymbol>Btu<sub>IT</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="kJ" UNIT="kJ" value="1.05505585262">1.05505585262</value>
-   </unit>
-   <unit xmlns="" Code="[Btu_th]" CODE="[BTU_TH]" isMetric="no" class="heat">
-      <name>thermochemical British thermal unit</name>
-      <printSymbol>Btu<sub>th</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="kJ" UNIT="kJ" value="1.054350">1.054350</value>
-   </unit>
-   <unit xmlns="" Code="[Btu]" CODE="[BTU]" isMetric="no" class="heat">
-      <name>British thermal unit</name>
-      <printSymbol>btu</printSymbol>
-      <property>energy</property>
-      <value Unit="[Btu_th]" UNIT="[BTU_TH]" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[HP]" CODE="[HP]" isMetric="no" class="heat">
-      <name>horsepower</name>
-      <property>power</property>
-      <value Unit="[ft_i].[lbf_av]/s" UNIT="[FT_I].[LBF_AV]/S" value="550">550</value>
-   </unit>
-   <unit xmlns="" Code="tex" CODE="TEX" isMetric="yes" class="heat">
-      <name>tex</name>
-      <printSymbol>tex</printSymbol>
-      <property>linear mass density (of textile thread)</property>
-      <value value="1" Unit="g/km" UNIT="G/KM">1</value>
-   </unit>
-   <unit xmlns="" Code="[den]" CODE="[DEN]" isMetric="no" class="heat">
-      <name>Denier</name>
-      <printSymbol>den</printSymbol>
-      <property>linear mass density (of textile thread)</property>
-      <value value="1" Unit="g/9/km" UNIT="G/9/KM">1</value>
-   </unit>
-   <unit xmlns="" Code="m[H2O]" CODE="M[H2O]" isMetric="yes" class="clinical">
-      <name>meter of water column</name>
-      <printSymbol>m&#160;H<sub>
-            <r>2</r>
-         </sub>O</printSymbol>
-      <property>pressure</property>
-      <value Unit="kPa" UNIT="KPAL" value="980665e-5">9.80665</value>
-   </unit>
-   <unit xmlns="" Code="m[Hg]" CODE="M[HG]" isMetric="yes" class="clinical">
-      <name>meter of mercury column</name>
-      <printSymbol>m&#160;Hg</printSymbol>
-      <property>pressure</property>
-      <value Unit="kPa" UNIT="KPAL" value="133.3220">133.3220</value>
-   </unit>
-   <unit xmlns="" Code="[in_i'H2O]" CODE="[IN_I'H2O]" isMetric="no" class="clinical">
-      <name>inch of water column</name>
-      <printSymbol>in&#160;H<sub>
-            <r>2</r>
-         </sub>O</printSymbol>
-      <property>pressure</property>
-      <value Unit="m[H2O].[in_i]/m" UNIT="M[H2O].[IN_I]/M" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[in_i'Hg]" CODE="[IN_I'HG]" isMetric="no" class="clinical">
-      <name>inch of mercury column</name>
-      <printSymbol>in&#160;Hg</printSymbol>
-      <property>pressure</property>
-      <value Unit="m[Hg].[in_i]/m" UNIT="M[HG].[IN_I]/M" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[PRU]" CODE="[PRU]" isMetric="no" class="clinical">
-      <name>peripheral vascular resistance unit</name>
-      <printSymbol>P.R.U.</printSymbol>
-      <property>fluid resistance</property>
-      <value Unit="mm[Hg].s/ml" UNIT="MM[HG].S/ML" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[wood'U]" CODE="[WOOD'U]" isMetric="no" class="clinical">
-      <name>Wood unit</name>
-      <printSymbol>Wood U.</printSymbol>
-      <property>fluid resistance</property>
-      <value Unit="mm[Hg].min/L" UNIT="MM[HG].MIN/L" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[diop]" CODE="[DIOP]" isMetric="no" class="clinical">
-      <name>diopter</name>
-      <printSymbol>dpt</printSymbol>
-      <property>refraction of a lens</property>
-      <value Unit="/m" UNIT="/M" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[p'diop]" CODE="[P'DIOP]" isMetric="no" isSpecial="yes"
-         class="clinical">
-      <name>prism diopter</name>
-      <printSymbol>PD</printSymbol>
-      <property>refraction of a prism</property>
-      <value Unit="100tan(1 rad)" UNIT="100TAN(1 RAD)">
-         <function name="tanTimes100" value="1" Unit="deg"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="%[slope]" CODE="%[SLOPE]" isMetric="no" isSpecial="yes"
-         class="clinical">
-      <name>percent of slope</name>
-      <printSymbol>%</printSymbol>
-      <property>slope</property>
-      <value Unit="100tan(1 rad)" UNIT="100TAN(1 RAD)">
-         <function name="100tan" value="1" Unit="deg"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[mesh_i]" CODE="[MESH_I]" isMetric="no" class="clinical">
-      <name>mesh</name>
-      <property>lineic number</property>
-      <value Unit="/[in_i]" UNIT="/[IN_I]" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[Ch]" CODE="[CH]" isMetric="no" class="clinical">
-      <name>Charri&#232;re</name>
-      <name>french</name>
-      <printSymbol>Ch</printSymbol>
-      <property>gauge of catheters</property>
-      <value Unit="mm/3" UNIT="MM/3" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[drp]" CODE="[DRP]" isMetric="no" class="clinical">
-      <name>drop</name>
-      <printSymbol>drp</printSymbol>
-      <property>volume</property>
-      <value Unit="ml/20" UNIT="ML/20" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[hnsf'U]" CODE="[HNSF'U]" isMetric="no" class="clinical">
-      <name>Hounsfield unit</name>
-      <printSymbol>HF</printSymbol>
-      <property>x-ray attenuation</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[MET]" CODE="[MET]" isMetric="no" class="clinical">
-      <name>metabolic equivalent</name>
-      <printSymbol>MET</printSymbol>
-      <property>metabolic cost of physical activity</property>
-      <value Unit="mL/min/kg" UNIT="ML/MIN/KG" value="3.5">3.5</value>
-   </unit>
-   <unit xmlns="" Code="[hp'_X]" CODE="[HP'_X]" isMetric="no" isSpecial="yes"
-         class="clinical">
-      <name>homeopathic potency of decimal series (retired)</name>
-      <printSymbol>X</printSymbol>
-      <property>homeopathic potency (retired)</property>
-      <value Unit="hpX(1 1)" UNIT="HPX(1 1)">
-         <function name="hpX" value="1" Unit="1"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[hp'_C]" CODE="[HP'_C]" isMetric="no" isSpecial="yes"
-         class="clinical">
-      <name>homeopathic potency of centesimal series (retired)</name>
-      <printSymbol>C</printSymbol>
-      <property>homeopathic potency (retired)</property>
-      <value Unit="hpC(1 1)" UNIT="HPC(1 1)">
-         <function name="hpC" value="1" Unit="1"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[hp'_M]" CODE="[HP'_M]" isMetric="no" isSpecial="yes"
-         class="clinical">
-      <name>homeopathic potency of millesimal series (retired)</name>
-      <printSymbol>M</printSymbol>
-      <property>homeopathic potency (retired)</property>
-      <value Unit="hpM(1 1)" UNIT="HPM(1 1)">
-         <function name="hpM" value="1" Unit="1"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[hp'_Q]" CODE="[HP'_Q]" isMetric="no" isSpecial="yes"
-         class="clinical">
-      <name>homeopathic potency of quintamillesimal series (retired)</name>
-      <printSymbol>Q</printSymbol>
-      <property>homeopathic potency (retired)</property>
-      <value Unit="hpQ(1 1)" UNIT="HPQ(1 1)">
-         <function name="hpQ" value="1" Unit="1"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[hp_X]" CODE="[HP_X]" isMetric="no" isArbitrary="yes"
-         class="clinical">
-      <name>homeopathic potency of decimal hahnemannian series</name>
-      <printSymbol>X</printSymbol>
-      <property>homeopathic potency (Hahnemann)</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[hp_C]" CODE="[HP_C]" isMetric="no" isArbitrary="yes"
-         class="clinical">
-      <name>homeopathic potency of centesimal hahnemannian series</name>
-      <printSymbol>C</printSymbol>
-      <property>homeopathic potency (Hahnemann)</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[hp_M]" CODE="[HP_M]" isMetric="no" isArbitrary="yes"
-         class="clinical">
-      <name>homeopathic potency of millesimal hahnemannian series</name>
-      <printSymbol>M</printSymbol>
-      <property>homeopathic potency (Hahnemann)</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[hp_Q]" CODE="[HP_Q]" isMetric="no" isArbitrary="yes"
-         class="clinical">
-      <name>homeopathic potency of quintamillesimal hahnemannian series</name>
-      <printSymbol>Q</printSymbol>
-      <property>homeopathic potency (Hahnemann)</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[kp_X]" CODE="[KP_X]" isMetric="no" isArbitrary="yes"
-         class="clinical">
-      <name>homeopathic potency of decimal korsakovian series</name>
-      <printSymbol>X</printSymbol>
-      <property>homeopathic potency (Korsakov)</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[kp_C]" CODE="[KP_C]" isMetric="no" isArbitrary="yes"
-         class="clinical">
-      <name>homeopathic potency of centesimal korsakovian series</name>
-      <printSymbol>C</printSymbol>
-      <property>homeopathic potency (Korsakov)</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[kp_M]" CODE="[KP_M]" isMetric="no" isArbitrary="yes"
-         class="clinical">
-      <name>homeopathic potency of millesimal korsakovian series</name>
-      <printSymbol>M</printSymbol>
-      <property>homeopathic potency (Korsakov)</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[kp_Q]" CODE="[KP_Q]" isMetric="no" isArbitrary="yes"
-         class="clinical">
-      <name>homeopathic potency of quintamillesimal korsakovian series</name>
-      <printSymbol>Q</printSymbol>
-      <property>homeopathic potency (Korsakov)</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="eq" CODE="EQ" isMetric="yes" class="chemical">
-      <name>equivalents</name>
-      <printSymbol>eq</printSymbol>
-      <property>amount of substance</property>
-      <value Unit="mol" UNIT="MOL" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="osm" CODE="OSM" isMetric="yes" class="chemical">
-      <name>osmole</name>
-      <printSymbol>osm</printSymbol>
-      <property>amount of substance (dissolved particles)</property>
-      <value Unit="mol" UNIT="MOL" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[pH]" CODE="[PH]" isMetric="no" isSpecial="yes" class="chemical">
-      <name>pH</name>
-      <printSymbol>pH</printSymbol>
-      <property>acidity</property>
-      <value Unit="pH(1 mol/l)" UNIT="PH(1 MOL/L)">
-         <function name="pH" value="1" Unit="mol/l"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="g%" CODE="G%" isMetric="yes" class="chemical">
-      <name>gram percent</name>
-      <printSymbol>g%</printSymbol>
-      <property>mass concentration</property>
-      <value Unit="g/dl" UNIT="G/DL" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[S]" CODE="[S]" isMetric="no" class="chemical">
-      <name>Svedberg unit</name>
-      <printSymbol>S</printSymbol>
-      <property>sedimentation coefficient</property>
-      <value Unit="10*-13.s" UNIT="10*-13.S" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[HPF]" CODE="[HPF]" isMetric="no" class="chemical">
-      <name>high power field</name>
-      <printSymbol>HPF</printSymbol>
-      <property>view area in microscope</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[LPF]" CODE="[LPF]" isMetric="no" class="chemical">
-      <name>low power field</name>
-      <printSymbol>LPF</printSymbol>
-      <property>view area in microscope</property>
-      <value Unit="1" UNIT="1" value="100">100</value>
-   </unit>
-   <unit xmlns="" Code="kat" CODE="KAT" isMetric="yes" class="chemical">
-      <name>katal</name>
-      <printSymbol>kat</printSymbol>
-      <property>catalytic activity</property>
-      <value Unit="mol/s" UNIT="MOL/S" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="U" CODE="U" isMetric="yes" class="chemical">
-      <name>Unit</name>
-      <printSymbol>U</printSymbol>
-      <property>catalytic activity</property>
-      <value Unit="umol/min" UNIT="UMOL/MIN" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[iU]" CODE="[IU]" isMetric="yes" isArbitrary="yes"
-         class="chemical">
-      <name>international unit</name>
-      <printSymbol>IU</printSymbol>
-      <property>arbitrary</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[IU]" CODE="[IU]" isMetric="yes" isArbitrary="yes"
-         class="chemical">
-      <name>international unit</name>
-      <printSymbol>i.U.</printSymbol>
-      <property>arbitrary</property>
-      <value Unit="[iU]" UNIT="[IU]" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[arb'U]" CODE="[ARB'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>arbitary unit</name>
-      <printSymbol>arb. U</printSymbol>
-      <property>arbitrary</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[USP'U]" CODE="[USP'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>United States Pharmacopeia unit</name>
-      <printSymbol>U.S.P.</printSymbol>
-      <property>arbitrary</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[GPL'U]" CODE="[GPL'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>GPL unit</name>
-      <property>biologic activity of anticardiolipin IgG</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[MPL'U]" CODE="[MPL'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>MPL unit</name>
-      <property>biologic activity of anticardiolipin IgM</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[APL'U]" CODE="[APL'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>APL unit</name>
-      <property>biologic activity of anticardiolipin IgA</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[beth'U]" CODE="[BETH'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>Bethesda unit</name>
-      <property>biologic activity of factor VIII inhibitor</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[anti'Xa'U]" CODE="[ANTI'XA'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>anti factor Xa unit</name>
-      <property>biologic activity of factor Xa inhibitor (heparin)</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[todd'U]" CODE="[TODD'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>Todd unit</name>
-      <property>biologic activity antistreptolysin O</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[dye'U]" CODE="[DYE'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>Dye unit</name>
-      <property>biologic activity of amylase</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[smgy'U]" CODE="[SMGY'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>Somogyi unit</name>
-      <property>biologic activity of amylase</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[bdsk'U]" CODE="[BDSK'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>Bodansky unit</name>
-      <property>biologic activity of phosphatase</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[ka'U]" CODE="[KA'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>King-Armstrong unit</name>
-      <property>biologic activity of phosphatase</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[knk'U]" CODE="[KNK'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>Kunkel unit</name>
-      <property>arbitrary biologic activity</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[mclg'U]" CODE="[MCLG'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>Mac Lagan unit</name>
-      <property>arbitrary biologic activity</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[tb'U]" CODE="[TB'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>tuberculin unit</name>
-      <property>biologic activity of tuberculin</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[CCID_50]" CODE="[CCID_50]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>50% cell culture infectious dose</name>
-      <printSymbol>CCID<sub>50</sub>
-      </printSymbol>
-      <property>biologic activity (infectivity) of an infectious agent preparation</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[TCID_50]" CODE="[TCID_50]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>50% tissue culture infectious dose</name>
-      <printSymbol>TCID<sub>50</sub>
-      </printSymbol>
-      <property>biologic activity (infectivity) of an infectious agent preparation</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[EID_50]" CODE="[EID_50]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>50% embryo infectious dose</name>
-      <printSymbol>EID<sub>50</sub>
-      </printSymbol>
-      <property>biologic activity (infectivity) of an infectious agent preparation</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[PFU]" CODE="[PFU]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>plaque forming units</name>
-      <printSymbol>PFU</printSymbol>
-      <property>amount of an infectious agent</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[FFU]" CODE="[FFU]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>focus forming units</name>
-      <printSymbol>FFU</printSymbol>
-      <property>amount of an infectious agent</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[CFU]" CODE="[CFU]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>colony forming units</name>
-      <printSymbol>CFU</printSymbol>
-      <property>amount of a proliferating organism</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[BAU]" CODE="[BAU]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>bioequivalent allergen unit</name>
-      <printSymbol>BAU</printSymbol>
-      <property>amount of an allergen callibrated through in-vivo testing based on the ID50EAL method of (intradermal dilution for 50mm sum of erythema diameters</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[AU]" CODE="[AU]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>allergen unit</name>
-      <printSymbol>AU</printSymbol>
-      <property>procedure defined amount of an allergen using some reference standard</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[Amb'a'1'U]" CODE="[AMB'A'1'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>allergen unit for Ambrosia artemisiifolia</name>
-      <printSymbol>Amb a 1 U</printSymbol>
-      <property>procedure defined amount of the major allergen of ragweed.</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[PNU]" CODE="[PNU]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>protein nitrogen unit</name>
-      <printSymbol>PNU</printSymbol>
-      <property>procedure defined amount of a protein substance</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[Lf]" CODE="[LF]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>Limit of flocculation</name>
-      <printSymbol>Lf</printSymbol>
-      <property>procedure defined amount of an antigen substance</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[D'ag'U]" CODE="[D'AG'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>D-antigen unit</name>
-      <printSymbol/>
-      <property>procedure defined amount of a poliomyelitis d-antigen substance</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[FEU]" CODE="[FEU]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>fibrinogen equivalent unit</name>
-      <printSymbol/>
-      <property>amount of fibrinogen broken down into the measured d-dimers</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[ELU]" CODE="[ELU]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>ELISA unit</name>
-      <printSymbol/>
-      <property>arbitrary ELISA unit</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[EU]" CODE="[EU]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>Ehrlich unit</name>
-      <printSymbol/>
-      <property>Ehrlich unit</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Np" CODE="NEP" isMetric="yes" isSpecial="yes" class="levels">
-      <name>neper</name>
-      <printSymbol>Np</printSymbol>
-      <property>level</property>
-      <value Unit="ln(1 1)" UNIT="LN(1 1)">
-         <function name="ln" value="1" Unit="1"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="B" CODE="B" isMetric="yes" isSpecial="yes" class="levels">
-      <name>bel</name>
-      <printSymbol>B</printSymbol>
-      <property>level</property>
-      <value Unit="lg(1 1)" UNIT="LG(1 1)">
-         <function name="lg" value="1" Unit="1"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="B[SPL]" CODE="B[SPL]" isMetric="yes" isSpecial="yes"
-         class="levels">
-      <name>bel sound pressure</name>
-      <printSymbol>B(SPL)</printSymbol>
-      <property>pressure level</property>
-      <value Unit="2lg(2 10*-5.Pa)" UNIT="2LG(2 10*-5.PAL)">
-         <function name="lgTimes2" value="2" Unit="10*-5.Pa"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="B[V]" CODE="B[V]" isMetric="yes" isSpecial="yes" class="levels">
-      <name>bel volt</name>
-      <printSymbol>B(V)</printSymbol>
-      <property>electric potential level</property>
-      <value Unit="2lg(1 V)" UNIT="2LG(1 V)">
-         <function name="lgTimes2" value="1" Unit="V"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="B[mV]" CODE="B[MV]" isMetric="yes" isSpecial="yes" class="levels">
-      <name>bel millivolt</name>
-      <printSymbol>B(mV)</printSymbol>
-      <property>electric potential level</property>
-      <value Unit="2lg(1 mV)" UNIT="2LG(1 MV)">
-         <function name="lgTimes2" value="1" Unit="mV"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="B[uV]" CODE="B[UV]" isMetric="yes" isSpecial="yes" class="levels">
-      <name>bel microvolt</name>
-      <printSymbol>B(&#956;V)</printSymbol>
-      <property>electric potential level</property>
-      <value Unit="2lg(1 uV)" UNIT="2LG(1 UV)">
-         <function name="lgTimes2" value="1" Unit="uV"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="B[10.nV]" CODE="B[10.NV]" isMetric="yes" isSpecial="yes"
-         class="levels">
-      <name>bel 10 nanovolt</name>
-      <printSymbol>B(10 nV)</printSymbol>
-      <property>electric potential level</property>
-      <value Unit="2lg(10 nV)" UNIT="2LG(10 NV)">
-         <function name="lgTimes2" value="10" Unit="nV"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="B[W]" CODE="B[W]" isMetric="yes" isSpecial="yes" class="levels">
-      <name>bel watt</name>
-      <printSymbol>B(W)</printSymbol>
-      <property>power level</property>
-      <value Unit="lg(1 W)" UNIT="LG(1 W)">
-         <function name="lg" value="1" Unit="W"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="B[kW]" CODE="B[KW]" isMetric="yes" isSpecial="yes" class="levels">
-      <name>bel kilowatt</name>
-      <printSymbol>B(kW)</printSymbol>
-      <property>power level</property>
-      <value Unit="lg(1 kW)" UNIT="LG(1 KW)">
-         <function name="lg" value="1" Unit="kW"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="st" CODE="STR" isMetric="yes" class="misc">
-      <name>stere</name>
-      <printSymbol>st</printSymbol>
-      <property>volume</property>
-      <value Unit="m3" UNIT="M3" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Ao" CODE="AO" isMetric="no" class="misc">
-      <name>&#197;ngstr&#246;m</name>
-      <printSymbol>&#197;</printSymbol>
-      <property>length</property>
-      <value Unit="nm" UNIT="NM" value="0.1">0.1</value>
-   </unit>
-   <unit xmlns="" Code="b" CODE="BRN" isMetric="no" class="misc">
-      <name>barn</name>
-      <printSymbol>b</printSymbol>
-      <property>action area</property>
-      <value Unit="fm2" UNIT="FM2" value="100">100</value>
-   </unit>
-   <unit xmlns="" Code="att" CODE="ATT" isMetric="no" class="misc">
-      <name>technical atmosphere</name>
-      <printSymbol>at</printSymbol>
-      <property>pressure</property>
-      <value Unit="kgf/cm2" UNIT="KGF/CM2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="mho" CODE="MHO" isMetric="yes" class="misc">
-      <name>mho</name>
-      <printSymbol>mho</printSymbol>
-      <property>electric conductance</property>
-      <value Unit="S" UNIT="S" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[psi]" CODE="[PSI]" isMetric="no" class="misc">
-      <name>pound per sqare inch</name>
-      <printSymbol>psi</printSymbol>
-      <property>pressure</property>
-      <value Unit="[lbf_av]/[in_i]2" UNIT="[LBF_AV]/[IN_I]2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="circ" CODE="CIRC" isMetric="no" class="misc">
-      <name>circle</name>
-      <printSymbol>circ</printSymbol>
-      <property>plane angle</property>
-      <value Unit="[pi].rad" UNIT="[PI].RAD" value="2">2</value>
-   </unit>
-   <unit xmlns="" Code="sph" CODE="SPH" isMetric="no" class="misc">
-      <name>spere</name>
-      <printSymbol>sph</printSymbol>
-      <property>solid angle</property>
-      <value Unit="[pi].sr" UNIT="[PI].SR" value="4">4</value>
-   </unit>
-   <unit xmlns="" Code="[car_m]" CODE="[CAR_M]" isMetric="no" class="misc">
-      <name>metric carat</name>
-      <printSymbol>ct<sub>m</sub>
-      </printSymbol>
-      <property>mass</property>
-      <value Unit="g" UNIT="G" value="2e-1">0.2</value>
-   </unit>
-   <unit xmlns="" Code="[car_Au]" CODE="[CAR_AU]" isMetric="no" class="misc">
-      <name>carat of gold alloys</name>
-      <printSymbol>ct<sub>
-            <r>Au</r>
-         </sub>
-      </printSymbol>
-      <property>mass fraction</property>
-      <value Unit="/24" UNIT="/24" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[smoot]" CODE="[SMOOT]" isMetric="no" class="misc">
-      <name>Smoot</name>
-      <printSymbol/>
-      <property>length</property>
-      <value Unit="[in_i]" UNIT="[IN_I]" value="67">67</value>
-   </unit>
-   <unit xmlns="" Code="bit_s" CODE="BIT_S" isMetric="no" isSpecial="yes"
-         class="infotech">
-      <name>bit</name>
-      <printSymbol>bit<sub>s</sub>
-      </printSymbol>
-      <property>amount of information</property>
-      <value Unit="ld(1 1)" UNIT="ld(1 1)">
-         <function name="ld" value="1" Unit="1"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="bit" CODE="BIT" isMetric="yes" class="infotech">
-      <name>bit</name>
-      <printSymbol>bit</printSymbol>
-      <property>amount of information</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="By" CODE="BY" isMetric="yes" class="infotech">
-      <name>byte</name>
-      <printSymbol>B</printSymbol>
-      <property>amount of information</property>
-      <value Unit="bit" UNIT="bit" value="8">8</value>
-   </unit>
-   <unit xmlns="" Code="Bd" CODE="BD" isMetric="yes" class="infotech">
-      <name>baud</name>
-      <printSymbol>Bd</printSymbol>
-      <property>signal transmission rate</property>
-      <value Unit="/s" UNIT="/s" value="1">1</value>
-   </unit>
-   <prefix xmlns="" Code="Ki" CODE="KIB">
-      <name>kibi</name>
-      <printSymbol>Ki</printSymbol>
-      <value value="1024">1024</value>
-   </prefix>
-   <prefix xmlns="" Code="Mi" CODE="MIB">
-      <name>mebi</name>
-      <printSymbol>Mi</printSymbol>
-      <value value="1048576">1048576</value>
-   </prefix>
-   <prefix xmlns="" Code="Gi" CODE="GIB">
-      <name>gibi</name>
-      <printSymbol>Gi</printSymbol>
-      <value value="1073741824">1073741824</value>
-   </prefix>
-   <prefix xmlns="" Code="Ti" CODE="TIB">
-      <name>tebi</name>
-      <printSymbol>Ti</printSymbol>
-      <value value="1099511627776">1099511627776</value>
-   </prefix>
+<?xml version="1.0" encoding="ascii"?>
+<root xmlns="http://unitsofmeasure.org/ucum-essence" version="1.9"
+      revision="$Revision: 16410 $"
+      revision-date="$Date: 2013-10-21 21:24:43 -0700 (Mon, 21 Oct 2013) $">
+   <prefix xmlns="" Code="Y" CODE="YA">
+      <name>yotta</name>
+      <printSymbol>Y</printSymbol>
+      <value value="1e24">1 &#215; 10<sup>24</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="Z" CODE="ZA">
+      <name>zetta</name>
+      <printSymbol>Z</printSymbol>
+      <value value="1e21">1 &#215; 10<sup>21</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="E" CODE="EX">
+      <name>exa</name>
+      <printSymbol>E</printSymbol>
+      <value value="1e18">1 &#215; 10<sup>18</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="P" CODE="PT">
+      <name>peta</name>
+      <printSymbol>P</printSymbol>
+      <value value="1e15">1 &#215; 10<sup>15</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="T" CODE="TR">
+      <name>tera</name>
+      <printSymbol>T</printSymbol>
+      <value value="1e12">1 &#215; 10<sup>12</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="G" CODE="GA">
+      <name>giga</name>
+      <printSymbol>G</printSymbol>
+      <value value="1e9">1 &#215; 10<sup>9</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="M" CODE="MA">
+      <name>mega</name>
+      <printSymbol>M</printSymbol>
+      <value value="1e6">1 &#215; 10<sup>6</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="k" CODE="K">
+      <name>kilo</name>
+      <printSymbol>k</printSymbol>
+      <value value="1e3">1 &#215; 10<sup>3</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="h" CODE="H">
+      <name>hecto</name>
+      <printSymbol>h</printSymbol>
+      <value value="1e2">1 &#215; 10<sup>2</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="da" CODE="DA">
+      <name>deka</name>
+      <printSymbol>da</printSymbol>
+      <value value="1e1">1 &#215; 10<sup>1</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="d" CODE="D">
+      <name>deci</name>
+      <printSymbol>d</printSymbol>
+      <value value="1e-1">1 &#215; 10<sup>-1</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="c" CODE="C">
+      <name>centi</name>
+      <printSymbol>c</printSymbol>
+      <value value="1e-2">1 &#215; 10<sup>-2</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="m" CODE="M">
+      <name>milli</name>
+      <printSymbol>m</printSymbol>
+      <value value="1e-3">1 &#215; 10<sup>-3</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="u" CODE="U">
+      <name>micro</name>
+      <printSymbol>&#956;</printSymbol>
+      <value value="1e-6">1 &#215; 10<sup>-6</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="n" CODE="N">
+      <name>nano</name>
+      <printSymbol>n</printSymbol>
+      <value value="1e-9">1 &#215; 10<sup>-9</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="p" CODE="P">
+      <name>pico</name>
+      <printSymbol>p</printSymbol>
+      <value value="1e-12">1 &#215; 10<sup>-12</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="f" CODE="F">
+      <name>femto</name>
+      <printSymbol>f</printSymbol>
+      <value value="1e-15">1 &#215; 10<sup>-15</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="a" CODE="A">
+      <name>atto</name>
+      <printSymbol>a</printSymbol>
+      <value value="1e-18">1 &#215; 10<sup>-18</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="z" CODE="ZO">
+      <name>zepto</name>
+      <printSymbol>z</printSymbol>
+      <value value="1e-21">1 &#215; 10<sup>-21</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="y" CODE="YO">
+      <name>yocto</name>
+      <printSymbol>y</printSymbol>
+      <value value="1e-24">1 &#215; 10<sup>-24</sup>
+      </value>
+   </prefix>
+   <base-unit xmlns="" Code="m" CODE="M" dim="L">
+      <name>meter</name>
+      <printSymbol>m</printSymbol>
+      <property>length</property>
+   </base-unit>
+   <base-unit xmlns="" Code="s" CODE="S" dim="T">
+      <name>second</name>
+      <printSymbol>s</printSymbol>
+      <property>time</property>
+   </base-unit>
+   <base-unit xmlns="" Code="g" CODE="G" dim="M">
+      <name>gram</name>
+      <printSymbol>g</printSymbol>
+      <property>mass</property>
+   </base-unit>
+   <base-unit xmlns="" Code="rad" CODE="RAD" dim="A">
+      <name>radian</name>
+      <printSymbol>rad</printSymbol>
+      <property>plane angle</property>
+   </base-unit>
+   <base-unit xmlns="" Code="K" CODE="K" dim="C">
+      <name>Kelvin</name>
+      <printSymbol>K</printSymbol>
+      <property>temperature</property>
+   </base-unit>
+   <base-unit xmlns="" Code="C" CODE="C" dim="Q">
+      <name>Coulomb</name>
+      <printSymbol>C</printSymbol>
+      <property>electric charge</property>
+   </base-unit>
+   <base-unit xmlns="" Code="cd" CODE="CD" dim="F">
+      <name>candela</name>
+      <printSymbol>cd</printSymbol>
+      <property>luminous intensity</property>
+   </base-unit>
+   <unit xmlns="" Code="10*" CODE="10*" isMetric="no" class="dimless">
+      <name>the number ten for arbitrary powers</name>
+      <printSymbol>10</printSymbol>
+      <property>number</property>
+      <value Unit="1" UNIT="1" value="10">10</value>
+   </unit>
+   <unit xmlns="" Code="10^" CODE="10^" isMetric="no" class="dimless">
+      <name>the number ten for arbitrary powers</name>
+      <printSymbol>10</printSymbol>
+      <property>number</property>
+      <value Unit="1" UNIT="1" value="10">10</value>
+   </unit>
+   <unit xmlns="" Code="[pi]" CODE="[PI]" isMetric="no" class="dimless">
+      <name>the number pi</name>
+      <printSymbol>&#960;</printSymbol>
+      <property>number</property>
+      <value Unit="1" UNIT="1"
+             value="3.1415926535897932384626433832795028841971693993751058209749445923">&#960;</value>
+   </unit>
+   <unit xmlns="" Code="%" CODE="%" isMetric="no" class="dimless">
+      <name>percent</name>
+      <printSymbol>%</printSymbol>
+      <property>fraction</property>
+      <value Unit="10*-2" UNIT="10*-2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[ppth]" CODE="[PPTH]" isMetric="no" class="dimless">
+      <name>parts per thousand</name>
+      <printSymbol>ppth</printSymbol>
+      <property>fraction</property>
+      <value Unit="10*-3" UNIT="10*-3" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[ppm]" CODE="[PPM]" isMetric="no" class="dimless">
+      <name>parts per million</name>
+      <printSymbol>ppm</printSymbol>
+      <property>fraction</property>
+      <value Unit="10*-6" UNIT="10*-6" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[ppb]" CODE="[PPB]" isMetric="no" class="dimless">
+      <name>parts per billion</name>
+      <printSymbol>ppb</printSymbol>
+      <property>fraction</property>
+      <value Unit="10*-9" UNIT="10*-9" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[pptr]" CODE="[PPTR]" isMetric="no" class="dimless">
+      <name>parts per trillion</name>
+      <printSymbol>pptr</printSymbol>
+      <property>fraction</property>
+      <value Unit="10*-12" UNIT="10*-12" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="mol" CODE="MOL" isMetric="yes" class="si">
+      <name>mole</name>
+      <printSymbol>mol</printSymbol>
+      <property>amount of substance</property>
+      <value Unit="10*23" UNIT="10*23" value="6.0221367">6.0221367</value>
+   </unit>
+   <unit xmlns="" Code="sr" CODE="SR" isMetric="yes" class="si">
+      <name>steradian</name>
+      <printSymbol>sr</printSymbol>
+      <property>solid angle</property>
+      <value Unit="rad2" UNIT="RAD2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Hz" CODE="HZ" isMetric="yes" class="si">
+      <name>Hertz</name>
+      <printSymbol>Hz</printSymbol>
+      <property>frequency</property>
+      <value Unit="s-1" UNIT="S-1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="N" CODE="N" isMetric="yes" class="si">
+      <name>Newton</name>
+      <printSymbol>N</printSymbol>
+      <property>force</property>
+      <value Unit="kg.m/s2" UNIT="KG.M/S2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Pa" CODE="PAL" isMetric="yes" class="si">
+      <name>Pascal</name>
+      <printSymbol>Pa</printSymbol>
+      <property>pressure</property>
+      <value Unit="N/m2" UNIT="N/M2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="J" CODE="J" isMetric="yes" class="si">
+      <name>Joule</name>
+      <printSymbol>J</printSymbol>
+      <property>energy</property>
+      <value Unit="N.m" UNIT="N.M" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="W" CODE="W" isMetric="yes" class="si">
+      <name>Watt</name>
+      <printSymbol>W</printSymbol>
+      <property>power</property>
+      <value Unit="J/s" UNIT="J/S" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="A" CODE="A" isMetric="yes" class="si">
+      <name>Amp&#232;re</name>
+      <printSymbol>A</printSymbol>
+      <property>electric current</property>
+      <value Unit="C/s" UNIT="C/S" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="V" CODE="V" isMetric="yes" class="si">
+      <name>Volt</name>
+      <printSymbol>V</printSymbol>
+      <property>electric potential</property>
+      <value Unit="J/C" UNIT="J/C" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="F" CODE="F" isMetric="yes" class="si">
+      <name>Farad</name>
+      <printSymbol>F</printSymbol>
+      <property>electric capacitance</property>
+      <value Unit="C/V" UNIT="C/V" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Ohm" CODE="OHM" isMetric="yes" class="si">
+      <name>Ohm</name>
+      <printSymbol>&#937;</printSymbol>
+      <property>electric resistance</property>
+      <value Unit="V/A" UNIT="V/A" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="S" CODE="SIE" isMetric="yes" class="si">
+      <name>Siemens</name>
+      <printSymbol>S</printSymbol>
+      <property>electric conductance</property>
+      <value Unit="Ohm-1" UNIT="OHM-1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Wb" CODE="WB" isMetric="yes" class="si">
+      <name>Weber</name>
+      <printSymbol>Wb</printSymbol>
+      <property>magentic flux</property>
+      <value Unit="V.s" UNIT="V.S" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Cel" CODE="CEL" isMetric="yes" isSpecial="yes" class="si">
+      <name>degree Celsius</name>
+      <printSymbol>&#176;C</printSymbol>
+      <property>temperature</property>
+      <value Unit="cel(1 K)" UNIT="CEL(1 K)">
+         <function name="Cel" value="1" Unit="K"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="T" CODE="T" isMetric="yes" class="si">
+      <name>Tesla</name>
+      <printSymbol>T</printSymbol>
+      <property>magnetic flux density</property>
+      <value Unit="Wb/m2" UNIT="WB/M2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="H" CODE="H" isMetric="yes" class="si">
+      <name>Henry</name>
+      <printSymbol>H</printSymbol>
+      <property>inductance</property>
+      <value Unit="Wb/A" UNIT="WB/A" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="lm" CODE="LM" isMetric="yes" class="si">
+      <name>lumen</name>
+      <printSymbol>lm</printSymbol>
+      <property>luminous flux</property>
+      <value Unit="cd.sr" UNIT="CD.SR" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="lx" CODE="LX" isMetric="yes" class="si">
+      <name>lux</name>
+      <printSymbol>lx</printSymbol>
+      <property>illuminance</property>
+      <value Unit="lm/m2" UNIT="LM/M2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Bq" CODE="BQ" isMetric="yes" class="si">
+      <name>Becquerel</name>
+      <printSymbol>Bq</printSymbol>
+      <property>radioactivity</property>
+      <value Unit="s-1" UNIT="S-1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Gy" CODE="GY" isMetric="yes" class="si">
+      <name>Gray</name>
+      <printSymbol>Gy</printSymbol>
+      <property>energy dose</property>
+      <value Unit="J/kg" UNIT="J/KG" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Sv" CODE="SV" isMetric="yes" class="si">
+      <name>Sievert</name>
+      <printSymbol>Sv</printSymbol>
+      <property>dose equivalent</property>
+      <value Unit="J/kg" UNIT="J/KG" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="gon" CODE="GON" isMetric="no" class="iso1000">
+      <name>gon</name>
+      <name>grade</name>
+      <printSymbol>&#9633;<sup>g</sup>
+      </printSymbol>
+      <property>plane angle</property>
+      <value Unit="deg" UNIT="DEG" value="0.9">0.9</value>
+   </unit>
+   <unit xmlns="" Code="deg" CODE="DEG" isMetric="no" class="iso1000">
+      <name>degree</name>
+      <printSymbol>&#176;</printSymbol>
+      <property>plane angle</property>
+      <value Unit="[pi].rad/360" UNIT="[PI].RAD/360" value="2">2</value>
+   </unit>
+   <unit xmlns="" Code="'" CODE="'" isMetric="no" class="iso1000">
+      <name>minute</name>
+      <printSymbol>'</printSymbol>
+      <property>plane angle</property>
+      <value Unit="deg/60" UNIT="DEG/60" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="''" CODE="''" isMetric="no" class="iso1000">
+      <name>second</name>
+      <printSymbol>''</printSymbol>
+      <property>plane angle</property>
+      <value Unit="'/60" UNIT="'/60" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="l" CODE="L" isMetric="yes" class="iso1000">
+      <name>liter</name>
+      <printSymbol>l</printSymbol>
+      <property>volume</property>
+      <value Unit="dm3" UNIT="DM3" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="L" isMetric="yes" class="iso1000">
+      <name>liter</name>
+      <printSymbol>L</printSymbol>
+      <property>volume</property>
+      <value Unit="l" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="ar" CODE="AR" isMetric="yes" class="iso1000">
+      <name>are</name>
+      <printSymbol>a</printSymbol>
+      <property>area</property>
+      <value Unit="m2" UNIT="M2" value="100">100</value>
+   </unit>
+   <unit xmlns="" Code="min" CODE="MIN" isMetric="no" class="iso1000">
+      <name>minute</name>
+      <printSymbol>min</printSymbol>
+      <property>time</property>
+      <value Unit="s" UNIT="S" value="60">60</value>
+   </unit>
+   <unit xmlns="" Code="h" CODE="HR" isMetric="no" class="iso1000">
+      <name>hour</name>
+      <printSymbol>h</printSymbol>
+      <property>time</property>
+      <value Unit="min" UNIT="MIN" value="60">60</value>
+   </unit>
+   <unit xmlns="" Code="d" CODE="D" isMetric="no" class="iso1000">
+      <name>day</name>
+      <printSymbol>d</printSymbol>
+      <property>time</property>
+      <value Unit="h" UNIT="HR" value="24">24</value>
+   </unit>
+   <unit xmlns="" Code="a_t" CODE="ANN_T" isMetric="no" class="iso1000">
+      <name>tropical year</name>
+      <printSymbol>a<sub>t</sub>
+      </printSymbol>
+      <property>time</property>
+      <value Unit="d" UNIT="D" value="365.24219">365.24219</value>
+   </unit>
+   <unit xmlns="" Code="a_j" CODE="ANN_J" isMetric="no" class="iso1000">
+      <name>mean Julian year</name>
+      <printSymbol>a<sub>j</sub>
+      </printSymbol>
+      <property>time</property>
+      <value Unit="d" UNIT="D" value="365.25">365.25</value>
+   </unit>
+   <unit xmlns="" Code="a_g" CODE="ANN_G" isMetric="no" class="iso1000">
+      <name>mean Gregorian year</name>
+      <printSymbol>a<sub>g</sub>
+      </printSymbol>
+      <property>time</property>
+      <value Unit="d" UNIT="D" value="365.2425">365.2425</value>
+   </unit>
+   <unit xmlns="" Code="a" CODE="ANN" isMetric="no" class="iso1000">
+      <name>year</name>
+      <printSymbol>a</printSymbol>
+      <property>time</property>
+      <value Unit="a_j" UNIT="ANN_J" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="wk" CODE="WK" isMetric="no" class="iso1000">
+      <name>week</name>
+      <printSymbol>wk</printSymbol>
+      <property>time</property>
+      <value Unit="d" UNIT="D" value="7">7</value>
+   </unit>
+   <unit xmlns="" Code="mo_s" CODE="MO_S" isMetric="no" class="iso1000">
+      <name>synodal month</name>
+      <printSymbol>mo<sub>s</sub>
+      </printSymbol>
+      <property>time</property>
+      <value Unit="d" UNIT="D" value="29.53059">29.53059</value>
+   </unit>
+   <unit xmlns="" Code="mo_j" CODE="MO_J" isMetric="no" class="iso1000">
+      <name>mean Julian month</name>
+      <printSymbol>mo<sub>j</sub>
+      </printSymbol>
+      <property>time</property>
+      <value Unit="a_j/12" UNIT="ANN_J/12" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="mo_g" CODE="MO_G" isMetric="no" class="iso1000">
+      <name>mean Gregorian month</name>
+      <printSymbol>mo<sub>g</sub>
+      </printSymbol>
+      <property>time</property>
+      <value Unit="a_g/12" UNIT="ANN_G/12" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="mo" CODE="MO" isMetric="no" class="iso1000">
+      <name>month</name>
+      <printSymbol>mo</printSymbol>
+      <property>time</property>
+      <value Unit="mo_j" UNIT="MO_J" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="t" CODE="TNE" isMetric="yes" class="iso1000">
+      <name>tonne</name>
+      <printSymbol>t</printSymbol>
+      <property>mass</property>
+      <value Unit="kg" UNIT="KG" value="1e3">1 &#215; 10<sup>3</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="bar" CODE="BAR" isMetric="yes" class="iso1000">
+      <name>bar</name>
+      <printSymbol>bar</printSymbol>
+      <property>pressure</property>
+      <value Unit="Pa" UNIT="PAL" value="1e5">1 &#215; 10<sup>5</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="u" CODE="AMU" isMetric="yes" class="iso1000">
+      <name>unified atomic mass unit</name>
+      <printSymbol>u</printSymbol>
+      <property>mass</property>
+      <value Unit="g" UNIT="G" value="1.6605402e-24">1.6605402 &#215; 10<sup>-24</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="eV" CODE="EV" isMetric="yes" class="iso1000">
+      <name>electronvolt</name>
+      <printSymbol>eV</printSymbol>
+      <property>energy</property>
+      <value Unit="[e].V" UNIT="[E].V" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="AU" CODE="ASU" isMetric="no" class="iso1000">
+      <name>astronomic unit</name>
+      <printSymbol>AU</printSymbol>
+      <property>length</property>
+      <value Unit="Mm" UNIT="MAM" value="149597.870691">149597.870691</value>
+   </unit>
+   <unit xmlns="" Code="pc" CODE="PRS" isMetric="yes" class="iso1000">
+      <name>parsec</name>
+      <printSymbol>pc</printSymbol>
+      <property>length</property>
+      <value Unit="m" UNIT="M" value="3.085678e16">3.085678 &#215; 10<sup>16</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[c]" CODE="[C]" isMetric="yes" class="const">
+      <name>velocity of light</name>
+      <printSymbol>
+         <i>c</i>
+      </printSymbol>
+      <property>velocity</property>
+      <value Unit="m/s" UNIT="M/S" value="299792458">299792458</value>
+   </unit>
+   <unit xmlns="" Code="[h]" CODE="[H]" isMetric="yes" class="const">
+      <name>Planck constant</name>
+      <printSymbol>
+         <i>h</i>
+      </printSymbol>
+      <property>action</property>
+      <value Unit="J.s" UNIT="J.S" value="6.6260755e-24">6.6260755 &#215; 10<sup>-24</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[k]" CODE="[K]" isMetric="yes" class="const">
+      <name>Boltzmann constant</name>
+      <printSymbol>
+         <i>k</i>
+      </printSymbol>
+      <property>(unclassified)</property>
+      <value Unit="J/K" UNIT="J/K" value="1.380658e-23">1.380658 &#215; 10<sup>-23</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[eps_0]" CODE="[EPS_0]" isMetric="yes" class="const">
+      <name>permittivity of vacuum</name>
+      <printSymbol>
+         <i>&#949;<sub>
+               <r>0</r>
+            </sub>
+         </i>
+      </printSymbol>
+      <property>electric permittivity</property>
+      <value Unit="F/m" UNIT="F/M" value="8.854187817e-12">8.854187817 &#215; 10<sup>-12</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[mu_0]" CODE="[MU_0]" isMetric="yes" class="const">
+      <name>permeability of vacuum</name>
+      <printSymbol>
+         <i>&#956;<sub>
+               <r>0</r>
+            </sub>
+         </i>
+      </printSymbol>
+      <property>magnetic permeability</property>
+      <value Unit="4.[pi].10*-7.N/A2" UNIT="4.[PI].10*-7.N/A2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[e]" CODE="[E]" isMetric="yes" class="const">
+      <name>elementary charge</name>
+      <printSymbol>
+         <i>e</i>
+      </printSymbol>
+      <property>electric charge</property>
+      <value Unit="C" UNIT="C" value="1.60217733e-19">1.60217733 &#215; 10<sup>-19</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[m_e]" CODE="[M_E]" isMetric="yes" class="const">
+      <name>electron mass</name>
+      <printSymbol>
+         <i>m<sub>
+               <r>e</r>
+            </sub>
+         </i>
+      </printSymbol>
+      <property>mass</property>
+      <value Unit="g" UNIT="g" value="9.1093897e-28">9.1093897 &#215; 10<sup>-28</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[m_p]" CODE="[M_P]" isMetric="yes" class="const">
+      <name>proton mass</name>
+      <printSymbol>
+         <i>m<sub>
+               <r>p</r>
+            </sub>
+         </i>
+      </printSymbol>
+      <property>mass</property>
+      <value Unit="g" UNIT="g" value="1.6726231e-24">1.6726231 &#215; 10<sup>-24</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[G]" CODE="[GC]" isMetric="yes" class="const">
+      <name>Newtonian constant of gravitation</name>
+      <printSymbol>
+         <i>G</i>
+      </printSymbol>
+      <property>(unclassified)</property>
+      <value Unit="m3.kg-1.s-2" UNIT="M3.KG-1.S-2" value="6.67259e-11">6.67259 &#215; 10<sup>-11</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[g]" CODE="[G]" isMetric="yes" class="const">
+      <name>standard acceleration of free fall</name>
+      <printSymbol>
+         <i>g<sub>n</sub>
+         </i>
+      </printSymbol>
+      <property>acceleration</property>
+      <value Unit="m/s2" UNIT="M/S2" value="980665e-5">9.80665</value>
+   </unit>
+   <unit xmlns="" Code="atm" CODE="ATM" isMetric="no" class="const">
+      <name>standard atmosphere</name>
+      <printSymbol>atm</printSymbol>
+      <property>pressure</property>
+      <value Unit="Pa" UNIT="PAL" value="101325">101325</value>
+   </unit>
+   <unit xmlns="" Code="[ly]" CODE="[LY]" isMetric="yes" class="const">
+      <name>light-year</name>
+      <printSymbol>l.y.</printSymbol>
+      <property>length</property>
+      <value Unit="[c].a_j" UNIT="[C].ANN_J" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="gf" CODE="GF" isMetric="yes" class="const">
+      <name>gram-force</name>
+      <printSymbol>gf</printSymbol>
+      <property>force</property>
+      <value Unit="g.[g]" UNIT="G.[G]" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[lbf_av]" CODE="[LBF_AV]" isMetric="no" class="const">
+      <name>pound force</name>
+      <printSymbol>lbf</printSymbol>
+      <property>force</property>
+      <value Unit="[lb_av].[g]" UNIT="[LB_AV].[G]" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Ky" CODE="KY" isMetric="yes" class="cgs">
+      <name>Kayser</name>
+      <printSymbol>K</printSymbol>
+      <property>lineic number</property>
+      <value Unit="cm-1" UNIT="CM-1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Gal" CODE="GL" isMetric="yes" class="cgs">
+      <name>Gal</name>
+      <printSymbol>Gal</printSymbol>
+      <property>acceleration</property>
+      <value Unit="cm/s2" UNIT="CM/S2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="dyn" CODE="DYN" isMetric="yes" class="cgs">
+      <name>dyne</name>
+      <printSymbol>dyn</printSymbol>
+      <property>force</property>
+      <value Unit="g.cm/s2" UNIT="G.CM/S2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="erg" CODE="ERG" isMetric="yes" class="cgs">
+      <name>erg</name>
+      <printSymbol>erg</printSymbol>
+      <property>energy</property>
+      <value Unit="dyn.cm" UNIT="DYN.CM" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="P" CODE="P" isMetric="yes" class="cgs">
+      <name>Poise</name>
+      <printSymbol>P</printSymbol>
+      <property>dynamic viscosity</property>
+      <value Unit="dyn.s/cm2" UNIT="DYN.S/CM2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Bi" CODE="BI" isMetric="yes" class="cgs">
+      <name>Biot</name>
+      <printSymbol>Bi</printSymbol>
+      <property>electric current</property>
+      <value Unit="A" UNIT="A" value="10">10</value>
+   </unit>
+   <unit xmlns="" Code="St" CODE="ST" isMetric="yes" class="cgs">
+      <name>Stokes</name>
+      <printSymbol>St</printSymbol>
+      <property>kinematic viscosity</property>
+      <value Unit="cm2/s" UNIT="CM2/S" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Mx" CODE="MX" isMetric="yes" class="cgs">
+      <name>Maxwell</name>
+      <printSymbol>Mx</printSymbol>
+      <property>flux of magnetic induction</property>
+      <value Unit="Wb" UNIT="WB" value="1e-8">1 &#215; 10<sup>-8</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="G" CODE="GS" isMetric="yes" class="cgs">
+      <name>Gauss</name>
+      <printSymbol>Gs</printSymbol>
+      <property>magnetic flux density</property>
+      <value Unit="T" UNIT="T" value="1e-4">1 &#215; 10<sup>-4</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="Oe" CODE="OE" isMetric="yes" class="cgs">
+      <name>Oersted</name>
+      <printSymbol>Oe</printSymbol>
+      <property>magnetic field intensity</property>
+      <value Unit="/[pi].A/m" UNIT="/[PI].A/M" value="250">250</value>
+   </unit>
+   <unit xmlns="" Code="Gb" CODE="GB" isMetric="yes" class="cgs">
+      <name>Gilbert</name>
+      <printSymbol>Gb</printSymbol>
+      <property>magnetic tension</property>
+      <value Unit="Oe.cm" UNIT="OE.CM" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="sb" CODE="SB" isMetric="yes" class="cgs">
+      <name>stilb</name>
+      <printSymbol>sb</printSymbol>
+      <property>lum. intensity density</property>
+      <value Unit="cd/cm2" UNIT="CD/CM2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Lmb" CODE="LMB" isMetric="yes" class="cgs">
+      <name>Lambert</name>
+      <printSymbol>L</printSymbol>
+      <property>brightness</property>
+      <value Unit="cd/cm2/[pi]" UNIT="CD/CM2/[PI]" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="ph" CODE="PHT" isMetric="yes" class="cgs">
+      <name>phot</name>
+      <printSymbol>ph</printSymbol>
+      <property>illuminance</property>
+      <value Unit="lx" UNIT="LX" value="1e-4">1 &#215; 10<sup>-4</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="Ci" CODE="CI" isMetric="yes" class="cgs">
+      <name>Curie</name>
+      <printSymbol>Ci</printSymbol>
+      <property>radioactivity</property>
+      <value Unit="Bq" UNIT="BQ" value="37e9">3.7 &#215; 10<sup>10</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="R" CODE="ROE" isMetric="yes" class="cgs">
+      <name>Roentgen</name>
+      <printSymbol>R</printSymbol>
+      <property>ion dose</property>
+      <value Unit="C/kg" UNIT="C/KG" value="2.58e-4">2.58 &#215; 10<sup>-4</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="RAD" CODE="[RAD]" isMetric="yes" class="cgs">
+      <name>radiation absorbed dose</name>
+      <printSymbol>RAD</printSymbol>
+      <property>energy dose</property>
+      <value Unit="erg/g" UNIT="ERG/G" value="100">100</value>
+   </unit>
+   <unit xmlns="" Code="REM" CODE="[REM]" isMetric="yes" class="cgs">
+      <name>radiation equivalent man</name>
+      <printSymbol>REM</printSymbol>
+      <property>dose equivalent</property>
+      <value Unit="RAD" UNIT="[RAD]" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[in_i]" CODE="[IN_I]" isMetric="no" class="intcust">
+      <name>inch</name>
+      <printSymbol>in</printSymbol>
+      <property>length</property>
+      <value Unit="cm" UNIT="CM" value="254e-2">2.54</value>
+   </unit>
+   <unit xmlns="" Code="[ft_i]" CODE="[FT_I]" isMetric="no" class="intcust">
+      <name>foot</name>
+      <printSymbol>ft</printSymbol>
+      <property>length</property>
+      <value Unit="[in_i]" UNIT="[IN_I]" value="12">12</value>
+   </unit>
+   <unit xmlns="" Code="[yd_i]" CODE="[YD_I]" isMetric="no" class="intcust">
+      <name>yard</name>
+      <printSymbol>yd</printSymbol>
+      <property>length</property>
+      <value Unit="[ft_i]" UNIT="[FT_I]" value="3">3</value>
+   </unit>
+   <unit xmlns="" Code="[mi_i]" CODE="[MI_I]" isMetric="no" class="intcust">
+      <name>statute mile</name>
+      <printSymbol>mi</printSymbol>
+      <property>length</property>
+      <value Unit="[ft_i]" UNIT="[FT_I]" value="5280">5280</value>
+   </unit>
+   <unit xmlns="" Code="[fth_i]" CODE="[FTH_I]" isMetric="no" class="intcust">
+      <name>fathom</name>
+      <printSymbol>fth</printSymbol>
+      <property>depth of water</property>
+      <value Unit="[ft_i]" UNIT="[FT_I]" value="6">6</value>
+   </unit>
+   <unit xmlns="" Code="[nmi_i]" CODE="[NMI_I]" isMetric="no" class="intcust">
+      <name>nautical mile</name>
+      <printSymbol>n.mi</printSymbol>
+      <property>length</property>
+      <value Unit="m" UNIT="M" value="1852">1852</value>
+   </unit>
+   <unit xmlns="" Code="[kn_i]" CODE="[KN_I]" isMetric="no" class="intcust">
+      <name>knot</name>
+      <printSymbol>knot</printSymbol>
+      <property>velocity</property>
+      <value Unit="[nmi_i]/h" UNIT="[NMI_I]/H" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[sin_i]" CODE="[SIN_I]" isMetric="no" class="intcust">
+      <name>square inch</name>
+      <property>area</property>
+      <value Unit="[in_i]2" UNIT="[IN_I]2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[sft_i]" CODE="[SFT_I]" isMetric="no" class="intcust">
+      <name>square foot</name>
+      <property>area</property>
+      <value Unit="[ft_i]2" UNIT="[FT_I]2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[syd_i]" CODE="[SYD_I]" isMetric="no" class="intcust">
+      <name>square yard</name>
+      <property>area</property>
+      <value Unit="[yd_i]2" UNIT="[YD_I]2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[cin_i]" CODE="[CIN_I]" isMetric="no" class="intcust">
+      <name>cubic inch</name>
+      <property>volume</property>
+      <value Unit="[in_i]3" UNIT="[IN_I]3" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[cft_i]" CODE="[CFT_I]" isMetric="no" class="intcust">
+      <name>cubic foot</name>
+      <property>volume</property>
+      <value Unit="[ft_i]3" UNIT="[FT_I]3" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[cyd_i]" CODE="[CYD_I]" isMetric="no" class="intcust">
+      <name>cubic yard</name>
+      <printSymbol>cu.yd</printSymbol>
+      <property>volume</property>
+      <value Unit="[yd_i]3" UNIT="[YD_I]3" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[bf_i]" CODE="[BF_I]" isMetric="no" class="intcust">
+      <name>board foot</name>
+      <property>volume</property>
+      <value Unit="[in_i]3" UNIT="[IN_I]3" value="144">144</value>
+   </unit>
+   <unit xmlns="" Code="[cr_i]" CODE="[CR_I]" isMetric="no" class="intcust">
+      <name>cord</name>
+      <property>volume</property>
+      <value Unit="[ft_i]3" UNIT="[FT_I]3" value="128">128</value>
+   </unit>
+   <unit xmlns="" Code="[mil_i]" CODE="[MIL_I]" isMetric="no" class="intcust">
+      <name>mil</name>
+      <printSymbol>mil</printSymbol>
+      <property>length</property>
+      <value Unit="[in_i]" UNIT="[IN_I]" value="1e-3">1 &#215; 10<sup>-3</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[cml_i]" CODE="[CML_I]" isMetric="no" class="intcust">
+      <name>circular mil</name>
+      <printSymbol>circ.mil</printSymbol>
+      <property>area</property>
+      <value Unit="[pi]/4.[mil_i]2" UNIT="[PI]/4.[MIL_I]2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[hd_i]" CODE="[HD_I]" isMetric="no" class="intcust">
+      <name>hand</name>
+      <printSymbol>hd</printSymbol>
+      <property>height of horses</property>
+      <value Unit="[in_i]" UNIT="[IN_I]" value="4">4</value>
+   </unit>
+   <unit xmlns="" Code="[ft_us]" CODE="[FT_US]" isMetric="no" class="us-lengths">
+      <name>foot</name>
+      <printSymbol>ft<sub>us</sub>
+      </printSymbol>
+      <property>length</property>
+      <value Unit="m/3937" UNIT="M/3937" value="1200">1200</value>
+   </unit>
+   <unit xmlns="" Code="[yd_us]" CODE="[YD_US]" isMetric="no" class="us-lengths">
+      <name>yard</name>
+      <property>length</property>
+      <value Unit="[ft_us]" UNIT="[FT_US]" value="3">3</value>
+   </unit>
+   <unit xmlns="" Code="[in_us]" CODE="[IN_US]" isMetric="no" class="us-lengths">
+      <name>inch</name>
+      <property>length</property>
+      <value Unit="[ft_us]/12" UNIT="[FT_US]/12" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[rd_us]" CODE="[RD_US]" isMetric="no" class="us-lengths">
+      <name>rod</name>
+      <property>length</property>
+      <value Unit="[ft_us]" UNIT="[FT_US]" value="16.5">16.5</value>
+   </unit>
+   <unit xmlns="" Code="[ch_us]" CODE="[CH_US]" isMetric="no" class="us-lengths">
+      <name>Gunter's chain</name>
+      <name>Surveyor's chain</name>
+      <property>length</property>
+      <value Unit="[rd_us]" UNIT="[RD_US]" value="4">4</value>
+   </unit>
+   <unit xmlns="" Code="[lk_us]" CODE="[LK_US]" isMetric="no" class="us-lengths">
+      <name>link for Gunter's chain</name>
+      <property>length</property>
+      <value Unit="[ch_us]/100" UNIT="[CH_US]/100" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[rch_us]" CODE="[RCH_US]" isMetric="no" class="us-lengths">
+      <name>Ramden's chain</name>
+      <name>Engineer's chain</name>
+      <property>length</property>
+      <value Unit="[ft_us]" UNIT="[FT_US]" value="100">100</value>
+   </unit>
+   <unit xmlns="" Code="[rlk_us]" CODE="[RLK_US]" isMetric="no" class="us-lengths">
+      <name>link for Ramden's chain</name>
+      <property>length</property>
+      <value Unit="[rch_us]/100" UNIT="[RCH_US]/100" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[fth_us]" CODE="[FTH_US]" isMetric="no" class="us-lengths">
+      <name>fathom</name>
+      <property>length</property>
+      <value Unit="[ft_us]" UNIT="[FT_US]" value="6">6</value>
+   </unit>
+   <unit xmlns="" Code="[fur_us]" CODE="[FUR_US]" isMetric="no" class="us-lengths">
+      <name>furlong</name>
+      <property>length</property>
+      <value Unit="[rd_us]" UNIT="[RD_US]" value="40">40</value>
+   </unit>
+   <unit xmlns="" Code="[mi_us]" CODE="[MI_US]" isMetric="no" class="us-lengths">
+      <name>mile</name>
+      <property>length</property>
+      <value Unit="[fur_us]" UNIT="[FUR_US]" value="8">8</value>
+   </unit>
+   <unit xmlns="" Code="[acr_us]" CODE="[ACR_US]" isMetric="no" class="us-lengths">
+      <name>acre</name>
+      <property>area</property>
+      <value Unit="[rd_us]2" UNIT="[RD_US]2" value="160">160</value>
+   </unit>
+   <unit xmlns="" Code="[srd_us]" CODE="[SRD_US]" isMetric="no" class="us-lengths">
+      <name>square rod</name>
+      <property>area</property>
+      <value Unit="[rd_us]2" UNIT="[RD_US]2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[smi_us]" CODE="[SMI_US]" isMetric="no" class="us-lengths">
+      <name>square mile</name>
+      <property>area</property>
+      <value Unit="[mi_us]2" UNIT="[MI_US]2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[sct]" CODE="[SCT]" isMetric="no" class="us-lengths">
+      <name>section</name>
+      <property>area</property>
+      <value Unit="[mi_us]2" UNIT="[MI_US]2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[twp]" CODE="[TWP]" isMetric="no" class="us-lengths">
+      <name>township</name>
+      <property>area</property>
+      <value Unit="[sct]" UNIT="[SCT]" value="36">36</value>
+   </unit>
+   <unit xmlns="" Code="[mil_us]" CODE="[MIL_US]" isMetric="no" class="us-lengths">
+      <name>mil</name>
+      <property>length</property>
+      <value Unit="[in_us]" UNIT="[IN_US]" value="1e-3">1 &#215; 10<sup>-3</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[in_br]" CODE="[IN_BR]" isMetric="no" class="brit-length">
+      <name>inch</name>
+      <property>length</property>
+      <value Unit="cm" UNIT="CM" value="2.539998">2.539998</value>
+   </unit>
+   <unit xmlns="" Code="[ft_br]" CODE="[FT_BR]" isMetric="no" class="brit-length">
+      <name>foot</name>
+      <property>length</property>
+      <value Unit="[in_br]" UNIT="[IN_BR]" value="12">12</value>
+   </unit>
+   <unit xmlns="" Code="[rd_br]" CODE="[RD_BR]" isMetric="no" class="brit-length">
+      <name>rod</name>
+      <property>length</property>
+      <value Unit="[ft_br]" UNIT="[FT_BR]" value="16.5">16.5</value>
+   </unit>
+   <unit xmlns="" Code="[ch_br]" CODE="[CH_BR]" isMetric="no" class="brit-length">
+      <name>Gunter's chain</name>
+      <property>length</property>
+      <value Unit="[rd_br]" UNIT="[RD_BR]" value="4">4</value>
+   </unit>
+   <unit xmlns="" Code="[lk_br]" CODE="[LK_BR]" isMetric="no" class="brit-length">
+      <name>link for Gunter's chain</name>
+      <property>length</property>
+      <value Unit="[ch_br]/100" UNIT="[CH_BR]/100" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[fth_br]" CODE="[FTH_BR]" isMetric="no" class="brit-length">
+      <name>fathom</name>
+      <property>length</property>
+      <value Unit="[ft_br]" UNIT="[FT_BR]" value="6">6</value>
+   </unit>
+   <unit xmlns="" Code="[pc_br]" CODE="[PC_BR]" isMetric="no" class="brit-length">
+      <name>pace</name>
+      <property>length</property>
+      <value Unit="[ft_br]" UNIT="[FT_BR]" value="2.5">2.5</value>
+   </unit>
+   <unit xmlns="" Code="[yd_br]" CODE="[YD_BR]" isMetric="no" class="brit-length">
+      <name>yard</name>
+      <property>length</property>
+      <value Unit="[ft_br]" UNIT="[FT_BR]" value="3">3</value>
+   </unit>
+   <unit xmlns="" Code="[mi_br]" CODE="[MI_BR]" isMetric="no" class="brit-length">
+      <name>mile</name>
+      <property>length</property>
+      <value Unit="[ft_br]" UNIT="[FT_BR]" value="5280">5280</value>
+   </unit>
+   <unit xmlns="" Code="[nmi_br]" CODE="[NMI_BR]" isMetric="no" class="brit-length">
+      <name>nautical mile</name>
+      <property>length</property>
+      <value Unit="[ft_br]" UNIT="[FT_BR]" value="6080">6080</value>
+   </unit>
+   <unit xmlns="" Code="[kn_br]" CODE="[KN_BR]" isMetric="no" class="brit-length">
+      <name>knot</name>
+      <property>velocity</property>
+      <value Unit="[nmi_br]/h" UNIT="[NMI_BR]/H" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[acr_br]" CODE="[ACR_BR]" isMetric="no" class="brit-length">
+      <name>acre</name>
+      <property>area</property>
+      <value Unit="[yd_br]2" UNIT="[YD_BR]2" value="4840">4840</value>
+   </unit>
+   <unit xmlns="" Code="[gal_us]" CODE="[GAL_US]" isMetric="no" class="us-volumes">
+      <name>Queen&#160;Anne's wine gallon</name>
+      <property>fluid volume</property>
+      <value Unit="[in_i]3" UNIT="[IN_I]3" value="231">231</value>
+   </unit>
+   <unit xmlns="" Code="[bbl_us]" CODE="[BBL_US]" isMetric="no" class="us-volumes">
+      <name>barrel</name>
+      <property>fluid volume</property>
+      <value Unit="[gal_us]" UNIT="[GAL_US]" value="42">42</value>
+   </unit>
+   <unit xmlns="" Code="[qt_us]" CODE="[QT_US]" isMetric="no" class="us-volumes">
+      <name>quart</name>
+      <property>fluid volume</property>
+      <value Unit="[gal_us]/4" UNIT="[GAL_US]/4" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[pt_us]" CODE="[PT_US]" isMetric="no" class="us-volumes">
+      <name>pint</name>
+      <property>fluid volume</property>
+      <value Unit="[qt_us]/2" UNIT="[QT_US]/2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[gil_us]" CODE="[GIL_US]" isMetric="no" class="us-volumes">
+      <name>gill</name>
+      <property>fluid volume</property>
+      <value Unit="[pt_us]/4" UNIT="[PT_US]/4" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[foz_us]" CODE="[FOZ_US]" isMetric="no" class="us-volumes">
+      <name>fluid ounce</name>
+      <printSymbol>oz fl</printSymbol>
+      <property>fluid volume</property>
+      <value Unit="[gil_us]/4" UNIT="[GIL_US]/4" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[fdr_us]" CODE="[FDR_US]" isMetric="no" class="us-volumes">
+      <name>fluid dram</name>
+      <property>fluid volume</property>
+      <value Unit="[foz_us]/8" UNIT="[FOZ_US]/8" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[min_us]" CODE="[MIN_US]" isMetric="no" class="us-volumes">
+      <name>minim</name>
+      <property>fluid volume</property>
+      <value Unit="[fdr_us]/60" UNIT="[FDR_US]/60" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[crd_us]" CODE="[CRD_US]" isMetric="no" class="us-volumes">
+      <name>cord</name>
+      <property>fluid volume</property>
+      <value Unit="[ft_i]3" UNIT="[FT_I]3" value="128">128</value>
+   </unit>
+   <unit xmlns="" Code="[bu_us]" CODE="[BU_US]" isMetric="no" class="us-volumes">
+      <name>bushel</name>
+      <property>dry volume</property>
+      <value Unit="[in_i]3" UNIT="[IN_I]3" value="2150.42">2150.42</value>
+   </unit>
+   <unit xmlns="" Code="[gal_wi]" CODE="[GAL_WI]" isMetric="no" class="us-volumes">
+      <name>historical winchester gallon</name>
+      <property>dry volume</property>
+      <value Unit="[bu_us]/8" UNIT="[BU_US]/8" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[pk_us]" CODE="[PK_US]" isMetric="no" class="us-volumes">
+      <name>peck</name>
+      <property>dry volume</property>
+      <value Unit="[bu_us]/4" UNIT="[BU_US]/4" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[dqt_us]" CODE="[DQT_US]" isMetric="no" class="us-volumes">
+      <name>dry quart</name>
+      <property>dry volume</property>
+      <value Unit="[pk_us]/8" UNIT="[PK_US]/8" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[dpt_us]" CODE="[DPT_US]" isMetric="no" class="us-volumes">
+      <name>dry pint</name>
+      <property>dry volume</property>
+      <value Unit="[dqt_us]/2" UNIT="[DQT_US]/2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[tbs_us]" CODE="[TBS_US]" isMetric="no" class="us-volumes">
+      <name>tablespoon</name>
+      <property>volume</property>
+      <value Unit="[foz_us]/2" UNIT="[FOZ_US]/2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[tsp_us]" CODE="[TSP_US]" isMetric="no" class="us-volumes">
+      <name>teaspoon</name>
+      <property>volume</property>
+      <value Unit="[tbs_us]/3" UNIT="[TBS_US]/3" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[cup_us]" CODE="[CUP_US]" isMetric="no" class="us-volumes">
+      <name>cup</name>
+      <property>volume</property>
+      <value Unit="[tbs_us]" UNIT="[TBS_US]" value="16">16</value>
+   </unit>
+   <unit xmlns="" Code="[foz_m]" CODE="[FOZ_M]" isMetric="no" class="us-volumes">
+      <name>metric fluid ounce</name>
+      <printSymbol>oz fl</printSymbol>
+      <property>fluid volume</property>
+      <value Unit="mL" UNIT="ML" value="30">30</value>
+   </unit>
+   <unit xmlns="" Code="[cup_m]" CODE="[CUP_M]" isMetric="no" class="us-volumes">
+      <name>metric cup</name>
+      <property>volume</property>
+      <value Unit="mL" UNIT="ML" value="240">240</value>
+   </unit>
+   <unit xmlns="" Code="[tsp_m]" CODE="[TSP_M]" isMetric="no" class="us-volumes">
+      <name>metric teaspoon</name>
+      <property>volume</property>
+      <value Unit="mL" UNIT="mL" value="5">5</value>
+   </unit>
+   <unit xmlns="" Code="[tbs_m]" CODE="[TBS_M]" isMetric="no" class="us-volumes">
+      <name>metric tablespoon</name>
+      <property>volume</property>
+      <value Unit="mL" UNIT="mL" value="15">15</value>
+   </unit>
+   <unit xmlns="" Code="[gal_br]" CODE="[GAL_BR]" isMetric="no" class="brit-volumes">
+      <name>gallon</name>
+      <property>volume</property>
+      <value Unit="l" UNIT="L" value="4.54609">4.54609</value>
+   </unit>
+   <unit xmlns="" Code="[pk_br]" CODE="[PK_BR]" isMetric="no" class="brit-volumes">
+      <name>peck</name>
+      <property>volume</property>
+      <value Unit="[gal_br]" UNIT="[GAL_BR]" value="2">2</value>
+   </unit>
+   <unit xmlns="" Code="[bu_br]" CODE="[BU_BR]" isMetric="no" class="brit-volumes">
+      <name>bushel</name>
+      <property>volume</property>
+      <value Unit="[pk_br]" UNIT="[PK_BR]" value="4">4</value>
+   </unit>
+   <unit xmlns="" Code="[qt_br]" CODE="[QT_BR]" isMetric="no" class="brit-volumes">
+      <name>quart</name>
+      <property>volume</property>
+      <value Unit="[gal_br]/4" UNIT="[GAL_BR]/4" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[pt_br]" CODE="[PT_BR]" isMetric="no" class="brit-volumes">
+      <name>pint</name>
+      <property>volume</property>
+      <value Unit="[qt_br]/2" UNIT="[QT_BR]/2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[gil_br]" CODE="[GIL_BR]" isMetric="no" class="brit-volumes">
+      <name>gill</name>
+      <property>volume</property>
+      <value Unit="[pt_br]/4" UNIT="[PT_BR]/4" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[foz_br]" CODE="[FOZ_BR]" isMetric="no" class="brit-volumes">
+      <name>fluid ounce</name>
+      <property>volume</property>
+      <value Unit="[gil_br]/5" UNIT="[GIL_BR]/5" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[fdr_br]" CODE="[FDR_BR]" isMetric="no" class="brit-volumes">
+      <name>fluid dram</name>
+      <property>volume</property>
+      <value Unit="[foz_br]/8" UNIT="[FOZ_BR]/8" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[min_br]" CODE="[MIN_BR]" isMetric="no" class="brit-volumes">
+      <name>minim</name>
+      <property>volume</property>
+      <value Unit="[fdr_br]/60" UNIT="[FDR_BR]/60" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[gr]" CODE="[GR]" isMetric="no" class="avoirdupois">
+      <name>grain</name>
+      <property>mass</property>
+      <value Unit="mg" UNIT="MG" value="64.79891">64.79891</value>
+   </unit>
+   <unit xmlns="" Code="[lb_av]" CODE="[LB_AV]" isMetric="no" class="avoirdupois">
+      <name>pound</name>
+      <printSymbol>lb</printSymbol>
+      <property>mass</property>
+      <value Unit="[gr]" UNIT="[GR]" value="7000">7000</value>
+   </unit>
+   <unit xmlns="" Code="[oz_av]" CODE="[OZ_AV]" isMetric="no" class="avoirdupois">
+      <name>ounce</name>
+      <printSymbol>oz</printSymbol>
+      <property>mass</property>
+      <value Unit="[lb_av]/16" UNIT="[LB_AV]/16" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[dr_av]" CODE="[DR_AV]" isMetric="no" class="avoirdupois">
+      <name>dram</name>
+      <property>mass</property>
+      <value Unit="[oz_av]/16" UNIT="[OZ_AV]/16" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[scwt_av]" CODE="[SCWT_AV]" isMetric="no" class="avoirdupois">
+      <name>short hundredweight</name>
+      <name>U.S. hundredweight</name>
+      <property>mass</property>
+      <value Unit="[lb_av]" UNIT="[LB_AV]" value="100">100</value>
+   </unit>
+   <unit xmlns="" Code="[lcwt_av]" CODE="[LCWT_AV]" isMetric="no" class="avoirdupois">
+      <name>long hunderdweight</name>
+      <name>British hundredweight</name>
+      <property>mass</property>
+      <value Unit="[lb_av]" UNIT="[LB_AV]" value="112">112</value>
+   </unit>
+   <unit xmlns="" Code="[ston_av]" CODE="[STON_AV]" isMetric="no" class="avoirdupois">
+      <name>short ton</name>
+      <name>U.S. ton</name>
+      <property>mass</property>
+      <value Unit="[scwt_av]" UNIT="[SCWT_AV]" value="20">20</value>
+   </unit>
+   <unit xmlns="" Code="[lton_av]" CODE="[LTON_AV]" isMetric="no" class="avoirdupois">
+      <name>long ton</name>
+      <name>British ton</name>
+      <property>mass</property>
+      <value Unit="[lcwt_av]" UNIT="[LCWT_AV]" value="20">20</value>
+   </unit>
+   <unit xmlns="" Code="[stone_av]" CODE="[STONE_AV]" isMetric="no" class="avoirdupois">
+      <name>stone</name>
+      <name>British stone</name>
+      <property>mass</property>
+      <value Unit="[lb_av]" UNIT="[LB_AV]" value="14">14</value>
+   </unit>
+   <unit xmlns="" Code="[pwt_tr]" CODE="[PWT_TR]" isMetric="no" class="troy">
+      <name>pennyweight</name>
+      <property>mass</property>
+      <value Unit="[gr]" UNIT="[GR]" value="24">24</value>
+   </unit>
+   <unit xmlns="" Code="[oz_tr]" CODE="[OZ_TR]" isMetric="no" class="troy">
+      <name>ounce</name>
+      <property>mass</property>
+      <value Unit="[pwt_tr]" UNIT="[PWT_TR]" value="20">20</value>
+   </unit>
+   <unit xmlns="" Code="[lb_tr]" CODE="[LB_TR]" isMetric="no" class="troy">
+      <name>pound</name>
+      <property>mass</property>
+      <value Unit="[oz_tr]" UNIT="[OZ_TR]" value="12">12</value>
+   </unit>
+   <unit xmlns="" Code="[sc_ap]" CODE="[SC_AP]" isMetric="no" class="apoth">
+      <name>scruple</name>
+      <property>mass</property>
+      <value Unit="[gr]" UNIT="[GR]" value="20">20</value>
+   </unit>
+   <unit xmlns="" Code="[dr_ap]" CODE="[DR_AP]" isMetric="no" class="apoth">
+      <name>dram</name>
+      <name>drachm</name>
+      <property>mass</property>
+      <value Unit="[sc_ap]" UNIT="[SC_AP]" value="3">3</value>
+   </unit>
+   <unit xmlns="" Code="[oz_ap]" CODE="[OZ_AP]" isMetric="no" class="apoth">
+      <name>ounce</name>
+      <property>mass</property>
+      <value Unit="[dr_ap]" UNIT="[DR_AP]" value="8">8</value>
+   </unit>
+   <unit xmlns="" Code="[lb_ap]" CODE="[LB_AP]" isMetric="no" class="apoth">
+      <name>pound</name>
+      <property>mass</property>
+      <value Unit="[oz_ap]" UNIT="[OZ_AP]" value="12">12</value>
+   </unit>
+   <unit xmlns="" Code="[oz_m]" CODE="[OZ_M]" isMetric="no" class="apoth">
+      <name>metric ounce</name>
+      <property>mass</property>
+      <value Unit="g" UNIT="g" value="28">28</value>
+   </unit>
+   <unit xmlns="" Code="[lne]" CODE="[LNE]" isMetric="no" class="typeset">
+      <name>line</name>
+      <property>length</property>
+      <value Unit="[in_i]/12" UNIT="[IN_I]/12" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[pnt]" CODE="[PNT]" isMetric="no" class="typeset">
+      <name>point</name>
+      <property>length</property>
+      <value Unit="[lne]/6" UNIT="[LNE]/6" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[pca]" CODE="[PCA]" isMetric="no" class="typeset">
+      <name>pica</name>
+      <property>length</property>
+      <value Unit="[pnt]" UNIT="[PNT]" value="12">12</value>
+   </unit>
+   <unit xmlns="" Code="[pnt_pr]" CODE="[PNT_PR]" isMetric="no" class="typeset">
+      <name>Printer's point</name>
+      <property>length</property>
+      <value Unit="[in_i]" UNIT="[IN_I]" value="0.013837">0.013837</value>
+   </unit>
+   <unit xmlns="" Code="[pca_pr]" CODE="[PCA_PR]" isMetric="no" class="typeset">
+      <name>Printer's pica</name>
+      <property>length</property>
+      <value Unit="[pnt_pr]" UNIT="[PNT_PR]" value="12">12</value>
+   </unit>
+   <unit xmlns="" Code="[pied]" CODE="[PIED]" isMetric="no" class="typeset">
+      <name>pied</name>
+      <name>French foot</name>
+      <property>length</property>
+      <value Unit="cm" UNIT="CM" value="32.48">32.48</value>
+   </unit>
+   <unit xmlns="" Code="[pouce]" CODE="[POUCE]" isMetric="no" class="typeset">
+      <name>pouce</name>
+      <name>French inch</name>
+      <property>length</property>
+      <value Unit="[pied]/12" UNIT="[PIED]/12" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[ligne]" CODE="[LIGNE]" isMetric="no" class="typeset">
+      <name>ligne</name>
+      <name>French line</name>
+      <property>length</property>
+      <value Unit="[pouce]/12" UNIT="[POUCE]/12" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[didot]" CODE="[DIDOT]" isMetric="no" class="typeset">
+      <name>didot</name>
+      <name>Didot's point</name>
+      <property>length</property>
+      <value Unit="[ligne]/6" UNIT="[LIGNE]/6" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[cicero]" CODE="[CICERO]" isMetric="no" class="typeset">
+      <name>cicero</name>
+      <name>Didot's pica</name>
+      <property>length</property>
+      <value Unit="[didot]" UNIT="[DIDOT]" value="12">12</value>
+   </unit>
+   <unit xmlns="" Code="[degF]" CODE="[DEGF]" isMetric="no" isSpecial="yes" class="heat">
+      <name>degree Fahrenheit</name>
+      <printSymbol>&#176;F</printSymbol>
+      <property>temperature</property>
+      <value Unit="degf(5 K/9)" UNIT="DEGF(5 K/9)">
+         <function name="degF" value="5" Unit="K/9"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[degR]" CODE="[degR]" isMetric="no" class="heat">
+      <name>degree Rankine</name>
+      <printSymbol>&#176;R</printSymbol>
+      <property>temperature</property>
+      <value value="5" Unit="K/9" UNIT="K/9">5</value>
+   </unit>
+   <unit xmlns="" Code="cal_[15]" CODE="CAL_[15]" isMetric="yes" class="heat">
+      <name>calorie at 15&#160;&#176;C</name>
+      <printSymbol>cal<sub>15&#176;C</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="J" UNIT="J" value="4.18580">4.18580</value>
+   </unit>
+   <unit xmlns="" Code="cal_[20]" CODE="CAL_[20]" isMetric="yes" class="heat">
+      <name>calorie at 20&#160;&#176;C</name>
+      <printSymbol>cal<sub>20&#176;C</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="J" UNIT="J" value="4.18190">4.18190</value>
+   </unit>
+   <unit xmlns="" Code="cal_m" CODE="CAL_M" isMetric="yes" class="heat">
+      <name>mean calorie</name>
+      <printSymbol>cal<sub>m</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="J" UNIT="J" value="4.19002">4.19002</value>
+   </unit>
+   <unit xmlns="" Code="cal_IT" CODE="CAL_IT" isMetric="yes" class="heat">
+      <name>international table calorie</name>
+      <printSymbol>cal<sub>IT</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="J" UNIT="J" value="4.1868">4.1868</value>
+   </unit>
+   <unit xmlns="" Code="cal_th" CODE="CAL_TH" isMetric="yes" class="heat">
+      <name>thermochemical calorie</name>
+      <printSymbol>cal<sub>th</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="J" UNIT="J" value="4.184">4.184</value>
+   </unit>
+   <unit xmlns="" Code="cal" CODE="CAL" isMetric="yes" class="heat">
+      <name>calorie</name>
+      <printSymbol>cal</printSymbol>
+      <property>energy</property>
+      <value Unit="cal_th" UNIT="CAL_TH" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[Cal]" CODE="[CAL]" isMetric="no" class="heat">
+      <name>nutrition label Calories</name>
+      <printSymbol>Cal</printSymbol>
+      <property>energy</property>
+      <value Unit="kcal_th" UNIT="KCAL_TH" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[Btu_39]" CODE="[BTU_39]" isMetric="no" class="heat">
+      <name>British thermal unit at 39&#160;&#176;F</name>
+      <printSymbol>Btu<sub>39&#176;F</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="kJ" UNIT="kJ" value="1.05967">1.05967</value>
+   </unit>
+   <unit xmlns="" Code="[Btu_59]" CODE="[BTU_59]" isMetric="no" class="heat">
+      <name>British thermal unit at 59&#160;&#176;F</name>
+      <printSymbol>Btu<sub>59&#176;F</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="kJ" UNIT="kJ" value="1.05480">1.05480</value>
+   </unit>
+   <unit xmlns="" Code="[Btu_60]" CODE="[BTU_60]" isMetric="no" class="heat">
+      <name>British thermal unit at 60&#160;&#176;F</name>
+      <printSymbol>Btu<sub>60&#176;F</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="kJ" UNIT="kJ" value="1.05468">1.05468</value>
+   </unit>
+   <unit xmlns="" Code="[Btu_m]" CODE="[BTU_M]" isMetric="no" class="heat">
+      <name>mean British thermal unit</name>
+      <printSymbol>Btu<sub>m</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="kJ" UNIT="kJ" value="1.05587">1.05587</value>
+   </unit>
+   <unit xmlns="" Code="[Btu_IT]" CODE="[BTU_IT]" isMetric="no" class="heat">
+      <name>international table British thermal unit</name>
+      <printSymbol>Btu<sub>IT</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="kJ" UNIT="kJ" value="1.05505585262">1.05505585262</value>
+   </unit>
+   <unit xmlns="" Code="[Btu_th]" CODE="[BTU_TH]" isMetric="no" class="heat">
+      <name>thermochemical British thermal unit</name>
+      <printSymbol>Btu<sub>th</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="kJ" UNIT="kJ" value="1.054350">1.054350</value>
+   </unit>
+   <unit xmlns="" Code="[Btu]" CODE="[BTU]" isMetric="no" class="heat">
+      <name>British thermal unit</name>
+      <printSymbol>btu</printSymbol>
+      <property>energy</property>
+      <value Unit="[Btu_th]" UNIT="[BTU_TH]" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[HP]" CODE="[HP]" isMetric="no" class="heat">
+      <name>horsepower</name>
+      <property>power</property>
+      <value Unit="[ft_i].[lbf_av]/s" UNIT="[FT_I].[LBF_AV]/S" value="550">550</value>
+   </unit>
+   <unit xmlns="" Code="tex" CODE="TEX" isMetric="yes" class="heat">
+      <name>tex</name>
+      <printSymbol>tex</printSymbol>
+      <property>linear mass density (of textile thread)</property>
+      <value value="1" Unit="g/km" UNIT="G/KM">1</value>
+   </unit>
+   <unit xmlns="" Code="[den]" CODE="[DEN]" isMetric="no" class="heat">
+      <name>Denier</name>
+      <printSymbol>den</printSymbol>
+      <property>linear mass density (of textile thread)</property>
+      <value value="1" Unit="g/9/km" UNIT="G/9/KM">1</value>
+   </unit>
+   <unit xmlns="" Code="m[H2O]" CODE="M[H2O]" isMetric="yes" class="clinical">
+      <name>meter of water column</name>
+      <printSymbol>m&#160;H<sub>
+            <r>2</r>
+         </sub>O</printSymbol>
+      <property>pressure</property>
+      <value Unit="kPa" UNIT="KPAL" value="980665e-5">9.80665</value>
+   </unit>
+   <unit xmlns="" Code="m[Hg]" CODE="M[HG]" isMetric="yes" class="clinical">
+      <name>meter of mercury column</name>
+      <printSymbol>m&#160;Hg</printSymbol>
+      <property>pressure</property>
+      <value Unit="kPa" UNIT="KPAL" value="133.3220">133.3220</value>
+   </unit>
+   <unit xmlns="" Code="[in_i'H2O]" CODE="[IN_I'H2O]" isMetric="no" class="clinical">
+      <name>inch of water column</name>
+      <printSymbol>in&#160;H<sub>
+            <r>2</r>
+         </sub>O</printSymbol>
+      <property>pressure</property>
+      <value Unit="m[H2O].[in_i]/m" UNIT="M[H2O].[IN_I]/M" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[in_i'Hg]" CODE="[IN_I'HG]" isMetric="no" class="clinical">
+      <name>inch of mercury column</name>
+      <printSymbol>in&#160;Hg</printSymbol>
+      <property>pressure</property>
+      <value Unit="m[Hg].[in_i]/m" UNIT="M[HG].[IN_I]/M" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[PRU]" CODE="[PRU]" isMetric="no" class="clinical">
+      <name>peripheral vascular resistance unit</name>
+      <printSymbol>P.R.U.</printSymbol>
+      <property>fluid resistance</property>
+      <value Unit="mm[Hg].s/ml" UNIT="MM[HG].S/ML" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[wood'U]" CODE="[WOOD'U]" isMetric="no" class="clinical">
+      <name>Wood unit</name>
+      <printSymbol>Wood U.</printSymbol>
+      <property>fluid resistance</property>
+      <value Unit="mm[Hg].min/L" UNIT="MM[HG].MIN/L" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[diop]" CODE="[DIOP]" isMetric="no" class="clinical">
+      <name>diopter</name>
+      <printSymbol>dpt</printSymbol>
+      <property>refraction of a lens</property>
+      <value Unit="/m" UNIT="/M" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[p'diop]" CODE="[P'DIOP]" isMetric="no" isSpecial="yes"
+         class="clinical">
+      <name>prism diopter</name>
+      <printSymbol>PD</printSymbol>
+      <property>refraction of a prism</property>
+      <value Unit="100tan(1 rad)" UNIT="100TAN(1 RAD)">
+         <function name="tanTimes100" value="1" Unit="deg"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="%[slope]" CODE="%[SLOPE]" isMetric="no" isSpecial="yes"
+         class="clinical">
+      <name>percent of slope</name>
+      <printSymbol>%</printSymbol>
+      <property>slope</property>
+      <value Unit="100tan(1 rad)" UNIT="100TAN(1 RAD)">
+         <function name="100tan" value="1" Unit="deg"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[mesh_i]" CODE="[MESH_I]" isMetric="no" class="clinical">
+      <name>mesh</name>
+      <property>lineic number</property>
+      <value Unit="/[in_i]" UNIT="/[IN_I]" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[Ch]" CODE="[CH]" isMetric="no" class="clinical">
+      <name>Charri&#232;re</name>
+      <name>french</name>
+      <printSymbol>Ch</printSymbol>
+      <property>gauge of catheters</property>
+      <value Unit="mm/3" UNIT="MM/3" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[drp]" CODE="[DRP]" isMetric="no" class="clinical">
+      <name>drop</name>
+      <printSymbol>drp</printSymbol>
+      <property>volume</property>
+      <value Unit="ml/20" UNIT="ML/20" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[hnsf'U]" CODE="[HNSF'U]" isMetric="no" class="clinical">
+      <name>Hounsfield unit</name>
+      <printSymbol>HF</printSymbol>
+      <property>x-ray attenuation</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[MET]" CODE="[MET]" isMetric="no" class="clinical">
+      <name>metabolic equivalent</name>
+      <printSymbol>MET</printSymbol>
+      <property>metabolic cost of physical activity</property>
+      <value Unit="mL/min/kg" UNIT="ML/MIN/KG" value="3.5">3.5</value>
+   </unit>
+   <unit xmlns="" Code="[hp'_X]" CODE="[HP'_X]" isMetric="no" isSpecial="yes"
+         class="clinical">
+      <name>homeopathic potency of decimal series (retired)</name>
+      <printSymbol>X</printSymbol>
+      <property>homeopathic potency (retired)</property>
+      <value Unit="hpX(1 1)" UNIT="HPX(1 1)">
+         <function name="hpX" value="1" Unit="1"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[hp'_C]" CODE="[HP'_C]" isMetric="no" isSpecial="yes"
+         class="clinical">
+      <name>homeopathic potency of centesimal series (retired)</name>
+      <printSymbol>C</printSymbol>
+      <property>homeopathic potency (retired)</property>
+      <value Unit="hpC(1 1)" UNIT="HPC(1 1)">
+         <function name="hpC" value="1" Unit="1"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[hp'_M]" CODE="[HP'_M]" isMetric="no" isSpecial="yes"
+         class="clinical">
+      <name>homeopathic potency of millesimal series (retired)</name>
+      <printSymbol>M</printSymbol>
+      <property>homeopathic potency (retired)</property>
+      <value Unit="hpM(1 1)" UNIT="HPM(1 1)">
+         <function name="hpM" value="1" Unit="1"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[hp'_Q]" CODE="[HP'_Q]" isMetric="no" isSpecial="yes"
+         class="clinical">
+      <name>homeopathic potency of quintamillesimal series (retired)</name>
+      <printSymbol>Q</printSymbol>
+      <property>homeopathic potency (retired)</property>
+      <value Unit="hpQ(1 1)" UNIT="HPQ(1 1)">
+         <function name="hpQ" value="1" Unit="1"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[hp_X]" CODE="[HP_X]" isMetric="no" isArbitrary="yes"
+         class="clinical">
+      <name>homeopathic potency of decimal hahnemannian series</name>
+      <printSymbol>X</printSymbol>
+      <property>homeopathic potency (Hahnemann)</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[hp_C]" CODE="[HP_C]" isMetric="no" isArbitrary="yes"
+         class="clinical">
+      <name>homeopathic potency of centesimal hahnemannian series</name>
+      <printSymbol>C</printSymbol>
+      <property>homeopathic potency (Hahnemann)</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[hp_M]" CODE="[HP_M]" isMetric="no" isArbitrary="yes"
+         class="clinical">
+      <name>homeopathic potency of millesimal hahnemannian series</name>
+      <printSymbol>M</printSymbol>
+      <property>homeopathic potency (Hahnemann)</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[hp_Q]" CODE="[HP_Q]" isMetric="no" isArbitrary="yes"
+         class="clinical">
+      <name>homeopathic potency of quintamillesimal hahnemannian series</name>
+      <printSymbol>Q</printSymbol>
+      <property>homeopathic potency (Hahnemann)</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[kp_X]" CODE="[KP_X]" isMetric="no" isArbitrary="yes"
+         class="clinical">
+      <name>homeopathic potency of decimal korsakovian series</name>
+      <printSymbol>X</printSymbol>
+      <property>homeopathic potency (Korsakov)</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[kp_C]" CODE="[KP_C]" isMetric="no" isArbitrary="yes"
+         class="clinical">
+      <name>homeopathic potency of centesimal korsakovian series</name>
+      <printSymbol>C</printSymbol>
+      <property>homeopathic potency (Korsakov)</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[kp_M]" CODE="[KP_M]" isMetric="no" isArbitrary="yes"
+         class="clinical">
+      <name>homeopathic potency of millesimal korsakovian series</name>
+      <printSymbol>M</printSymbol>
+      <property>homeopathic potency (Korsakov)</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[kp_Q]" CODE="[KP_Q]" isMetric="no" isArbitrary="yes"
+         class="clinical">
+      <name>homeopathic potency of quintamillesimal korsakovian series</name>
+      <printSymbol>Q</printSymbol>
+      <property>homeopathic potency (Korsakov)</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="eq" CODE="EQ" isMetric="yes" class="chemical">
+      <name>equivalents</name>
+      <printSymbol>eq</printSymbol>
+      <property>amount of substance</property>
+      <value Unit="mol" UNIT="MOL" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="osm" CODE="OSM" isMetric="yes" class="chemical">
+      <name>osmole</name>
+      <printSymbol>osm</printSymbol>
+      <property>amount of substance (dissolved particles)</property>
+      <value Unit="mol" UNIT="MOL" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[pH]" CODE="[PH]" isMetric="no" isSpecial="yes" class="chemical">
+      <name>pH</name>
+      <printSymbol>pH</printSymbol>
+      <property>acidity</property>
+      <value Unit="pH(1 mol/l)" UNIT="PH(1 MOL/L)">
+         <function name="pH" value="1" Unit="mol/l"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="g%" CODE="G%" isMetric="yes" class="chemical">
+      <name>gram percent</name>
+      <printSymbol>g%</printSymbol>
+      <property>mass concentration</property>
+      <value Unit="g/dl" UNIT="G/DL" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[S]" CODE="[S]" isMetric="no" class="chemical">
+      <name>Svedberg unit</name>
+      <printSymbol>S</printSymbol>
+      <property>sedimentation coefficient</property>
+      <value Unit="10*-13.s" UNIT="10*-13.S" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[HPF]" CODE="[HPF]" isMetric="no" class="chemical">
+      <name>high power field</name>
+      <printSymbol>HPF</printSymbol>
+      <property>view area in microscope</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[LPF]" CODE="[LPF]" isMetric="no" class="chemical">
+      <name>low power field</name>
+      <printSymbol>LPF</printSymbol>
+      <property>view area in microscope</property>
+      <value Unit="1" UNIT="1" value="100">100</value>
+   </unit>
+   <unit xmlns="" Code="kat" CODE="KAT" isMetric="yes" class="chemical">
+      <name>katal</name>
+      <printSymbol>kat</printSymbol>
+      <property>catalytic activity</property>
+      <value Unit="mol/s" UNIT="MOL/S" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="U" CODE="U" isMetric="yes" class="chemical">
+      <name>Unit</name>
+      <printSymbol>U</printSymbol>
+      <property>catalytic activity</property>
+      <value Unit="umol/min" UNIT="UMOL/MIN" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[iU]" CODE="[IU]" isMetric="yes" isArbitrary="yes"
+         class="chemical">
+      <name>international unit</name>
+      <printSymbol>IU</printSymbol>
+      <property>arbitrary</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[IU]" CODE="[IU]" isMetric="yes" isArbitrary="yes"
+         class="chemical">
+      <name>international unit</name>
+      <printSymbol>i.U.</printSymbol>
+      <property>arbitrary</property>
+      <value Unit="[iU]" UNIT="[IU]" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[arb'U]" CODE="[ARB'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>arbitary unit</name>
+      <printSymbol>arb. U</printSymbol>
+      <property>arbitrary</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[USP'U]" CODE="[USP'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>United States Pharmacopeia unit</name>
+      <printSymbol>U.S.P.</printSymbol>
+      <property>arbitrary</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[GPL'U]" CODE="[GPL'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>GPL unit</name>
+      <property>biologic activity of anticardiolipin IgG</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[MPL'U]" CODE="[MPL'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>MPL unit</name>
+      <property>biologic activity of anticardiolipin IgM</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[APL'U]" CODE="[APL'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>APL unit</name>
+      <property>biologic activity of anticardiolipin IgA</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[beth'U]" CODE="[BETH'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>Bethesda unit</name>
+      <property>biologic activity of factor VIII inhibitor</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[anti'Xa'U]" CODE="[ANTI'XA'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>anti factor Xa unit</name>
+      <property>biologic activity of factor Xa inhibitor (heparin)</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[todd'U]" CODE="[TODD'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>Todd unit</name>
+      <property>biologic activity antistreptolysin O</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[dye'U]" CODE="[DYE'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>Dye unit</name>
+      <property>biologic activity of amylase</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[smgy'U]" CODE="[SMGY'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>Somogyi unit</name>
+      <property>biologic activity of amylase</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[bdsk'U]" CODE="[BDSK'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>Bodansky unit</name>
+      <property>biologic activity of phosphatase</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[ka'U]" CODE="[KA'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>King-Armstrong unit</name>
+      <property>biologic activity of phosphatase</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[knk'U]" CODE="[KNK'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>Kunkel unit</name>
+      <property>arbitrary biologic activity</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[mclg'U]" CODE="[MCLG'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>Mac Lagan unit</name>
+      <property>arbitrary biologic activity</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[tb'U]" CODE="[TB'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>tuberculin unit</name>
+      <property>biologic activity of tuberculin</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[CCID_50]" CODE="[CCID_50]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>50% cell culture infectious dose</name>
+      <printSymbol>CCID<sub>50</sub>
+      </printSymbol>
+      <property>biologic activity (infectivity) of an infectious agent preparation</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[TCID_50]" CODE="[TCID_50]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>50% tissue culture infectious dose</name>
+      <printSymbol>TCID<sub>50</sub>
+      </printSymbol>
+      <property>biologic activity (infectivity) of an infectious agent preparation</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[EID_50]" CODE="[EID_50]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>50% embryo infectious dose</name>
+      <printSymbol>EID<sub>50</sub>
+      </printSymbol>
+      <property>biologic activity (infectivity) of an infectious agent preparation</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[PFU]" CODE="[PFU]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>plaque forming units</name>
+      <printSymbol>PFU</printSymbol>
+      <property>amount of an infectious agent</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[FFU]" CODE="[FFU]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>focus forming units</name>
+      <printSymbol>FFU</printSymbol>
+      <property>amount of an infectious agent</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[CFU]" CODE="[CFU]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>colony forming units</name>
+      <printSymbol>CFU</printSymbol>
+      <property>amount of a proliferating organism</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[BAU]" CODE="[BAU]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>bioequivalent allergen unit</name>
+      <printSymbol>BAU</printSymbol>
+      <property>amount of an allergen callibrated through in-vivo testing based on the ID50EAL method of (intradermal dilution for 50mm sum of erythema diameters</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[AU]" CODE="[AU]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>allergen unit</name>
+      <printSymbol>AU</printSymbol>
+      <property>procedure defined amount of an allergen using some reference standard</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[Amb'a'1'U]" CODE="[AMB'A'1'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>allergen unit for Ambrosia artemisiifolia</name>
+      <printSymbol>Amb a 1 U</printSymbol>
+      <property>procedure defined amount of the major allergen of ragweed.</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[PNU]" CODE="[PNU]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>protein nitrogen unit</name>
+      <printSymbol>PNU</printSymbol>
+      <property>procedure defined amount of a protein substance</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[Lf]" CODE="[LF]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>Limit of flocculation</name>
+      <printSymbol>Lf</printSymbol>
+      <property>procedure defined amount of an antigen substance</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[D'ag'U]" CODE="[D'AG'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>D-antigen unit</name>
+      <printSymbol/>
+      <property>procedure defined amount of a poliomyelitis d-antigen substance</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[FEU]" CODE="[FEU]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>fibrinogen equivalent unit</name>
+      <printSymbol/>
+      <property>amount of fibrinogen broken down into the measured d-dimers</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[ELU]" CODE="[ELU]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>ELISA unit</name>
+      <printSymbol/>
+      <property>arbitrary ELISA unit</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[EU]" CODE="[EU]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>Ehrlich unit</name>
+      <printSymbol/>
+      <property>Ehrlich unit</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Np" CODE="NEP" isMetric="yes" isSpecial="yes" class="levels">
+      <name>neper</name>
+      <printSymbol>Np</printSymbol>
+      <property>level</property>
+      <value Unit="ln(1 1)" UNIT="LN(1 1)">
+         <function name="ln" value="1" Unit="1"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="B" CODE="B" isMetric="yes" isSpecial="yes" class="levels">
+      <name>bel</name>
+      <printSymbol>B</printSymbol>
+      <property>level</property>
+      <value Unit="lg(1 1)" UNIT="LG(1 1)">
+         <function name="lg" value="1" Unit="1"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="B[SPL]" CODE="B[SPL]" isMetric="yes" isSpecial="yes"
+         class="levels">
+      <name>bel sound pressure</name>
+      <printSymbol>B(SPL)</printSymbol>
+      <property>pressure level</property>
+      <value Unit="2lg(2 10*-5.Pa)" UNIT="2LG(2 10*-5.PAL)">
+         <function name="lgTimes2" value="2" Unit="10*-5.Pa"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="B[V]" CODE="B[V]" isMetric="yes" isSpecial="yes" class="levels">
+      <name>bel volt</name>
+      <printSymbol>B(V)</printSymbol>
+      <property>electric potential level</property>
+      <value Unit="2lg(1 V)" UNIT="2LG(1 V)">
+         <function name="lgTimes2" value="1" Unit="V"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="B[mV]" CODE="B[MV]" isMetric="yes" isSpecial="yes" class="levels">
+      <name>bel millivolt</name>
+      <printSymbol>B(mV)</printSymbol>
+      <property>electric potential level</property>
+      <value Unit="2lg(1 mV)" UNIT="2LG(1 MV)">
+         <function name="lgTimes2" value="1" Unit="mV"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="B[uV]" CODE="B[UV]" isMetric="yes" isSpecial="yes" class="levels">
+      <name>bel microvolt</name>
+      <printSymbol>B(&#956;V)</printSymbol>
+      <property>electric potential level</property>
+      <value Unit="2lg(1 uV)" UNIT="2LG(1 UV)">
+         <function name="lgTimes2" value="1" Unit="uV"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="B[10.nV]" CODE="B[10.NV]" isMetric="yes" isSpecial="yes"
+         class="levels">
+      <name>bel 10 nanovolt</name>
+      <printSymbol>B(10 nV)</printSymbol>
+      <property>electric potential level</property>
+      <value Unit="2lg(10 nV)" UNIT="2LG(10 NV)">
+         <function name="lgTimes2" value="10" Unit="nV"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="B[W]" CODE="B[W]" isMetric="yes" isSpecial="yes" class="levels">
+      <name>bel watt</name>
+      <printSymbol>B(W)</printSymbol>
+      <property>power level</property>
+      <value Unit="lg(1 W)" UNIT="LG(1 W)">
+         <function name="lg" value="1" Unit="W"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="B[kW]" CODE="B[KW]" isMetric="yes" isSpecial="yes" class="levels">
+      <name>bel kilowatt</name>
+      <printSymbol>B(kW)</printSymbol>
+      <property>power level</property>
+      <value Unit="lg(1 kW)" UNIT="LG(1 KW)">
+         <function name="lg" value="1" Unit="kW"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="st" CODE="STR" isMetric="yes" class="misc">
+      <name>stere</name>
+      <printSymbol>st</printSymbol>
+      <property>volume</property>
+      <value Unit="m3" UNIT="M3" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Ao" CODE="AO" isMetric="no" class="misc">
+      <name>&#197;ngstr&#246;m</name>
+      <printSymbol>&#197;</printSymbol>
+      <property>length</property>
+      <value Unit="nm" UNIT="NM" value="0.1">0.1</value>
+   </unit>
+   <unit xmlns="" Code="b" CODE="BRN" isMetric="no" class="misc">
+      <name>barn</name>
+      <printSymbol>b</printSymbol>
+      <property>action area</property>
+      <value Unit="fm2" UNIT="FM2" value="100">100</value>
+   </unit>
+   <unit xmlns="" Code="att" CODE="ATT" isMetric="no" class="misc">
+      <name>technical atmosphere</name>
+      <printSymbol>at</printSymbol>
+      <property>pressure</property>
+      <value Unit="kgf/cm2" UNIT="KGF/CM2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="mho" CODE="MHO" isMetric="yes" class="misc">
+      <name>mho</name>
+      <printSymbol>mho</printSymbol>
+      <property>electric conductance</property>
+      <value Unit="S" UNIT="S" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[psi]" CODE="[PSI]" isMetric="no" class="misc">
+      <name>pound per sqare inch</name>
+      <printSymbol>psi</printSymbol>
+      <property>pressure</property>
+      <value Unit="[lbf_av]/[in_i]2" UNIT="[LBF_AV]/[IN_I]2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="circ" CODE="CIRC" isMetric="no" class="misc">
+      <name>circle</name>
+      <printSymbol>circ</printSymbol>
+      <property>plane angle</property>
+      <value Unit="[pi].rad" UNIT="[PI].RAD" value="2">2</value>
+   </unit>
+   <unit xmlns="" Code="sph" CODE="SPH" isMetric="no" class="misc">
+      <name>spere</name>
+      <printSymbol>sph</printSymbol>
+      <property>solid angle</property>
+      <value Unit="[pi].sr" UNIT="[PI].SR" value="4">4</value>
+   </unit>
+   <unit xmlns="" Code="[car_m]" CODE="[CAR_M]" isMetric="no" class="misc">
+      <name>metric carat</name>
+      <printSymbol>ct<sub>m</sub>
+      </printSymbol>
+      <property>mass</property>
+      <value Unit="g" UNIT="G" value="2e-1">0.2</value>
+   </unit>
+   <unit xmlns="" Code="[car_Au]" CODE="[CAR_AU]" isMetric="no" class="misc">
+      <name>carat of gold alloys</name>
+      <printSymbol>ct<sub>
+            <r>Au</r>
+         </sub>
+      </printSymbol>
+      <property>mass fraction</property>
+      <value Unit="/24" UNIT="/24" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[smoot]" CODE="[SMOOT]" isMetric="no" class="misc">
+      <name>Smoot</name>
+      <printSymbol/>
+      <property>length</property>
+      <value Unit="[in_i]" UNIT="[IN_I]" value="67">67</value>
+   </unit>
+   <unit xmlns="" Code="bit_s" CODE="BIT_S" isMetric="no" isSpecial="yes"
+         class="infotech">
+      <name>bit</name>
+      <printSymbol>bit<sub>s</sub>
+      </printSymbol>
+      <property>amount of information</property>
+      <value Unit="ld(1 1)" UNIT="ld(1 1)">
+         <function name="ld" value="1" Unit="1"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="bit" CODE="BIT" isMetric="yes" class="infotech">
+      <name>bit</name>
+      <printSymbol>bit</printSymbol>
+      <property>amount of information</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="By" CODE="BY" isMetric="yes" class="infotech">
+      <name>byte</name>
+      <printSymbol>B</printSymbol>
+      <property>amount of information</property>
+      <value Unit="bit" UNIT="bit" value="8">8</value>
+   </unit>
+   <unit xmlns="" Code="Bd" CODE="BD" isMetric="yes" class="infotech">
+      <name>baud</name>
+      <printSymbol>Bd</printSymbol>
+      <property>signal transmission rate</property>
+      <value Unit="/s" UNIT="/s" value="1">1</value>
+   </unit>
+   <prefix xmlns="" Code="Ki" CODE="KIB">
+      <name>kibi</name>
+      <printSymbol>Ki</printSymbol>
+      <value value="1024">1024</value>
+   </prefix>
+   <prefix xmlns="" Code="Mi" CODE="MIB">
+      <name>mebi</name>
+      <printSymbol>Mi</printSymbol>
+      <value value="1048576">1048576</value>
+   </prefix>
+   <prefix xmlns="" Code="Gi" CODE="GIB">
+      <name>gibi</name>
+      <printSymbol>Gi</printSymbol>
+      <value value="1073741824">1073741824</value>
+   </prefix>
+   <prefix xmlns="" Code="Ti" CODE="TIB">
+      <name>tebi</name>
+      <printSymbol>Ti</printSymbol>
+      <value value="1099511627776">1099511627776</value>
+   </prefix>
 </root>
\ No newline at end of file
diff --git a/bundles/org.eclipse.uomo.ucum/.classpath b/bundles/org.eclipse.uomo.ucum/.classpath
index a625c7f..23d1b61 100644
--- a/bundles/org.eclipse.uomo.ucum/.classpath
+++ b/bundles/org.eclipse.uomo.ucum/.classpath
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src/main/java/"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/main/java/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/bundles/org.eclipse.uomo.ucum/.gitignore b/bundles/org.eclipse.uomo.ucum/.gitignore
index 2c36b17..21d5518 100644
--- a/bundles/org.eclipse.uomo.ucum/.gitignore
+++ b/bundles/org.eclipse.uomo.ucum/.gitignore
@@ -1,2 +1,2 @@
-/target
-/.settings
+/target
+/.settings
diff --git a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/UcumFormatService.java b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/UcumFormatService.java
index a03a847..ca9d5a6 100644
--- a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/UcumFormatService.java
+++ b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/UcumFormatService.java
@@ -1,56 +1,56 @@
-/**
- * Copyright (c) 2005, 2010, Werner Keil, JScience and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
- */
-package org.eclipse.uomo.ucum;
-
-import java.io.IOException;
-import java.text.ParsePosition;
-
-import org.unitsofmeasurement.service.UnitFormatService;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * <p> This interface provides methods for OSGi bundles to parse/format units
- *     as per the <a href="http://www.unitsofmeasure.org/">
- *     Unified Code for Units of Measure (UCUM)</a> specification.</p>
- *
- * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @see <a href="http://aurora.regenstrief.org/~ucum/ucum.html">UCUM Full Specification</a>
- * @version 1.1 ($Revision: 306 $), $Date: 2010-10-29 21:42:27 +0100 (Fr, 29 Okt 2010) $
- */
-public interface UcumFormatService extends UnitFormatService {
-
-    /**
-     * Formats the specified unit.
-     *
-     * @param unit the unit to format.
-     * @param appendable the appendable destination.
-     * @return the appendable destination passed in with formatted text appended.
-     * @throws IOException if an error occurs.
-     */
-    Appendable format(Unit<?> unit, Appendable appendable)
-            throws IOException;
-
-    /**
-     * Parses a portion of the specified {@link CharSequence} from the
-     * specified position to produce a unit. If there is no unit to parse
-     * the unitary unit (dimensionless) is returned.
-     *
-     * @param csq the <code>CharSequence</code> to parse.
-     * @param cursor the cursor holding the current parsing index or <code>
-     *        null</code> to parse the whole character sequence.
-     * @return the unit parsed from the specified character sub-sequence.
-     * @throws IllegalArgumentException if any problem occurs while parsing the
-     *         specified character sequence (e.g. illegal syntax).
-     */
-    Unit<?> parse(CharSequence csq, ParsePosition cursor)
-            throws IllegalArgumentException;
-}
+/**
+ * Copyright (c) 2005, 2010, Werner Keil, JScience and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
+ */
+package org.eclipse.uomo.ucum;
+
+import java.io.IOException;
+import java.text.ParsePosition;
+
+import org.unitsofmeasurement.service.UnitFormatService;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * <p> This interface provides methods for OSGi bundles to parse/format units
+ *     as per the <a href="http://www.unitsofmeasure.org/">
+ *     Unified Code for Units of Measure (UCUM)</a> specification.</p>
+ *
+ * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @see <a href="http://aurora.regenstrief.org/~ucum/ucum.html">UCUM Full Specification</a>
+ * @version 1.1 ($Revision: 306 $), $Date: 2010-10-29 21:42:27 +0100 (Fr, 29 Okt 2010) $
+ */
+public interface UcumFormatService extends UnitFormatService {
+
+    /**
+     * Formats the specified unit.
+     *
+     * @param unit the unit to format.
+     * @param appendable the appendable destination.
+     * @return the appendable destination passed in with formatted text appended.
+     * @throws IOException if an error occurs.
+     */
+    Appendable format(Unit<?> unit, Appendable appendable)
+            throws IOException;
+
+    /**
+     * Parses a portion of the specified {@link CharSequence} from the
+     * specified position to produce a unit. If there is no unit to parse
+     * the unitary unit (dimensionless) is returned.
+     *
+     * @param csq the <code>CharSequence</code> to parse.
+     * @param cursor the cursor holding the current parsing index or <code>
+     *        null</code> to parse the whole character sequence.
+     * @return the unit parsed from the specified character sub-sequence.
+     * @throws IllegalArgumentException if any problem occurs while parsing the
+     *         specified character sequence (e.g. illegal syntax).
+     */
+    Unit<?> parse(CharSequence csq, ParsePosition cursor)
+            throws IllegalArgumentException;
+}
diff --git a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/expression/Factor.java b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/expression/Factor.java
index 91d3e61..6f124dc 100644
--- a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/expression/Factor.java
+++ b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/expression/Factor.java
@@ -1,50 +1,50 @@
-/*******************************************************************************
- * Crown Copyright (c) 2006, 2008, Copyright (c) 2006, 2008 Kestral Computing P/L.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *    Kestral Computing P/L - initial implementation
- *******************************************************************************/
-
-package org.eclipse.uomo.ucum.expression;
-
-
-public class Factor extends Component {
-	
-	private int value;
-
-	/**
-	 * 
-	 */
-	public Factor() {
-		super();
-		// TODO Auto-generated constructor stub
-	}
-
-	/**
-	 * @param value
-	 */
-	public Factor(int value) {
-		super();
-		this.value = value;
-	}
-
-	/**
-	 * @return the value
-	 */
-	public int getValue() {
-		return value;
-	}
-
-	/**
-	 * @param value the value to set
-	 */
-	public void setValue(int value) {
-		this.value = value;
-	}
-
-	
-}
+/*******************************************************************************
+ * Crown Copyright (c) 2006, 2008, Copyright (c) 2006, 2008 Kestral Computing P/L.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *    Kestral Computing P/L - initial implementation
+ *******************************************************************************/
+
+package org.eclipse.uomo.ucum.expression;
+
+
+public class Factor extends Component {
+	
+	private int value;
+
+	/**
+	 * 
+	 */
+	public Factor() {
+		super();
+		// TODO Auto-generated constructor stub
+	}
+
+	/**
+	 * @param value
+	 */
+	public Factor(int value) {
+		super();
+		this.value = value;
+	}
+
+	/**
+	 * @return the value
+	 */
+	public int getValue() {
+		return value;
+	}
+
+	/**
+	 * @param value the value to set
+	 */
+	public void setValue(int value) {
+		this.value = value;
+	}
+
+	
+}
diff --git a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/expression/Symbol.java b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/expression/Symbol.java
index 3f7aaa3..0728179 100644
--- a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/expression/Symbol.java
+++ b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/expression/Symbol.java
@@ -1,92 +1,92 @@
-/*******************************************************************************
- * Crown Copyright (c) 2006, 2011, Copyright (c) 2006, 2008 Kestral Computing P/L.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *    Kestral Computing P/L - initial implementation
- *******************************************************************************/
-
-package org.eclipse.uomo.ucum.expression;
-
-import org.eclipse.uomo.ucum.model.Prefix;
-import org.eclipse.uomo.ucum.model.UcumUnit;
-
-public class Symbol extends Component {
-
-	private UcumUnit unit; // may be Base Unit or DefinedUnit
-	private Prefix prefix;  // only if unit is metric 
-	private int exponent;
-		
-	/**
-	 * 
-	 */
-	public Symbol() {
-		super();
-	}
-
-	/**
-	 * @param unit
-	 * @param prefix
-	 * @param exponent
-	 */
-	public Symbol(UcumUnit unit, Prefix prefix, int exponent) {
-		super();
-		this.unit = unit;
-		this.prefix = prefix;
-		this.exponent = exponent;
-	}
-
-	/**
-	 * @return the unit
-	 */
-	public UcumUnit getUnit() {
-		return unit;
-	}
-
-	/**
-	 * @param unit the unit to set
-	 */
-	public void setUnit(UcumUnit unit) {
-		this.unit = unit;
-	}
-
-	/**
-	 * @return the prefix
-	 */
-	public Prefix getPrefix() {
-		return prefix;
-	}
-
-	/**
-	 * @param prefix the prefix to set
-	 */
-	public void setPrefix(Prefix prefix) {
-		this.prefix = prefix;
-	}
-
-	/**
-	 * @return the exponent
-	 */
-	public int getExponent() {
-		return exponent;
-	}
-
-	/**
-	 * @param exponent the exponent to set
-	 */
-	public void setExponent(int exponent) {
-		this.exponent = exponent;
-	}
-	
-	public boolean hasPrefix() {
-		return prefix != null;
-	}
-
-	public void invertExponent() {
-		exponent = -exponent;
-	}
-	
-}
+/*******************************************************************************
+ * Crown Copyright (c) 2006, 2011, Copyright (c) 2006, 2008 Kestral Computing P/L.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *    Kestral Computing P/L - initial implementation
+ *******************************************************************************/
+
+package org.eclipse.uomo.ucum.expression;
+
+import org.eclipse.uomo.ucum.model.Prefix;
+import org.eclipse.uomo.ucum.model.UcumUnit;
+
+public class Symbol extends Component {
+
+	private UcumUnit unit; // may be Base Unit or DefinedUnit
+	private Prefix prefix;  // only if unit is metric 
+	private int exponent;
+		
+	/**
+	 * 
+	 */
+	public Symbol() {
+		super();
+	}
+
+	/**
+	 * @param unit
+	 * @param prefix
+	 * @param exponent
+	 */
+	public Symbol(UcumUnit unit, Prefix prefix, int exponent) {
+		super();
+		this.unit = unit;
+		this.prefix = prefix;
+		this.exponent = exponent;
+	}
+
+	/**
+	 * @return the unit
+	 */
+	public UcumUnit getUnit() {
+		return unit;
+	}
+
+	/**
+	 * @param unit the unit to set
+	 */
+	public void setUnit(UcumUnit unit) {
+		this.unit = unit;
+	}
+
+	/**
+	 * @return the prefix
+	 */
+	public Prefix getPrefix() {
+		return prefix;
+	}
+
+	/**
+	 * @param prefix the prefix to set
+	 */
+	public void setPrefix(Prefix prefix) {
+		this.prefix = prefix;
+	}
+
+	/**
+	 * @return the exponent
+	 */
+	public int getExponent() {
+		return exponent;
+	}
+
+	/**
+	 * @param exponent the exponent to set
+	 */
+	public void setExponent(int exponent) {
+		this.exponent = exponent;
+	}
+	
+	public boolean hasPrefix() {
+		return prefix != null;
+	}
+
+	public void invertExponent() {
+		exponent = -exponent;
+	}
+	
+}
diff --git a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/impl/Canonical.java b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/impl/Canonical.java
index 68694b3..46a3b54 100644
--- a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/impl/Canonical.java
+++ b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/impl/Canonical.java
@@ -1,79 +1,79 @@
-/*******************************************************************************
- * Crown Copyright (c) 2006, 2008, Copyright (c) 2006, 2008 Kestral Computing P/L.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *    Kestral Computing P/L - initial implementation
- *******************************************************************************/
-
-package org.eclipse.uomo.ucum.impl;
-
-import java.math.BigDecimal;
-import java.math.MathContext;
-
-import org.eclipse.uomo.ucum.expression.Term;
-
-// TODO replace this with extended QuantityAmount
-class Canonical {
-
-	private BigDecimal value;
-	private Term unit;
-	
-	/**
-	 * @param value
-	 * @param unit
-	 */
-	public Canonical(BigDecimal value, Term unit) {
-		super();
-		this.value = value;
-		this.unit = unit;
-	}
-
-	/**
-	 * @return the value
-	 */
-	public BigDecimal getValue() {
-		return value;
-	}
-
-	/**
-	 * @return the unit
-	 */
-	public Term getUnit() {
-		return unit;
-	}
-
-	/**
-	 * @param value the value to set
-	 */
-	public void setValue(BigDecimal value) {
-		this.value = value;
-	}
-
-	void multiplyValue(Number number) {
-		value = value.multiply((BigDecimal) number);		
-	}
-
-	void multiplyValue(int multiplicand) {
-		value = value.multiply(new BigDecimal(multiplicand));		
-	}
-
-	public boolean hasUnit() {
-		return unit != null;
-	}
-
-	/**
-	 * @param unit the unit to set
-	 */
-	public void setUnit(Term unit) {
-		this.unit = unit;
-	}
-
-	void divideValue(BigDecimal divisor) {
-		value = value.divide(divisor, new MathContext(20));		
-	}
-
-}
+/*******************************************************************************
+ * Crown Copyright (c) 2006, 2008, Copyright (c) 2006, 2008 Kestral Computing P/L.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *    Kestral Computing P/L - initial implementation
+ *******************************************************************************/
+
+package org.eclipse.uomo.ucum.impl;
+
+import java.math.BigDecimal;
+import java.math.MathContext;
+
+import org.eclipse.uomo.ucum.expression.Term;
+
+// TODO replace this with extended QuantityAmount
+class Canonical {
+
+	private BigDecimal value;
+	private Term unit;
+	
+	/**
+	 * @param value
+	 * @param unit
+	 */
+	public Canonical(BigDecimal value, Term unit) {
+		super();
+		this.value = value;
+		this.unit = unit;
+	}
+
+	/**
+	 * @return the value
+	 */
+	public BigDecimal getValue() {
+		return value;
+	}
+
+	/**
+	 * @return the unit
+	 */
+	public Term getUnit() {
+		return unit;
+	}
+
+	/**
+	 * @param value the value to set
+	 */
+	public void setValue(BigDecimal value) {
+		this.value = value;
+	}
+
+	void multiplyValue(Number number) {
+		value = value.multiply((BigDecimal) number);		
+	}
+
+	void multiplyValue(int multiplicand) {
+		value = value.multiply(new BigDecimal(multiplicand));		
+	}
+
+	public boolean hasUnit() {
+		return unit != null;
+	}
+
+	/**
+	 * @param unit the unit to set
+	 */
+	public void setUnit(Term unit) {
+		this.unit = unit;
+	}
+
+	void divideValue(BigDecimal divisor) {
+		value = value.divide(divisor, new MathContext(20));		
+	}
+
+}
diff --git a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/impl/UcumConverter.java b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/impl/UcumConverter.java
index 442480f..1a9b99a 100644
--- a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/impl/UcumConverter.java
+++ b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/impl/UcumConverter.java
@@ -1,327 +1,327 @@
-/*******************************************************************************
- * Crown Copyright (c) 2006, 2011, Copyright (c) 2006, 2008 Kestral Computing P/L.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *    Kestral Computing P/L - initial implementation
- *    
- *******************************************************************************/
-
-package org.eclipse.uomo.ucum.impl;
-
-import static org.eclipse.uomo.core.impl.OutputHelper.isConsoleOutput;
-import static org.eclipse.uomo.core.impl.OutputHelper.println;
-import static org.eclipse.uomo.ucum.model.ConceptKind.*;
-import static org.eclipse.uomo.ucum.expression.Operator.*;
-
-import java.math.BigDecimal;
-import java.math.MathContext;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.uomo.core.UOMoRuntimeException;
-import org.eclipse.uomo.ucum.expression.Component;
-import org.eclipse.uomo.ucum.expression.Factor;
-import org.eclipse.uomo.ucum.expression.Symbol;
-import org.eclipse.uomo.ucum.expression.Term;
-import org.eclipse.uomo.ucum.model.DefinedUnit;
-import org.eclipse.uomo.ucum.model.UcumModel;
-import org.eclipse.uomo.ucum.parsers.ExpressionComposer;
-import org.eclipse.uomo.ucum.parsers.ExpressionParser;
-import org.eclipse.uomo.ucum.special.SpecialUnitHandler;
-import org.eclipse.uomo.units.AbstractConverter;
-import org.eclipse.uomo.util.Registry;
-import org.unitsofmeasurement.unit.UnitConverter;
-
-/**
- * = [mu_0] = 4.[pi].10*-7.N/A2 = (g.m/s2)/(C/s)2? = g.m/s2/(C2/s2) =
- * g.m/s2/C2.s2 = g.m/C2.s2/s2 = g.m/C2 = m.g.C-2
- * 
- * @author Grahame Grieve
- * @author Werner Keil
- */
-class UcumConverter extends AbstractConverter {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = -895607408258138526L;
-	private final UcumModel model;
-	@SuppressWarnings("rawtypes")
-	private final Registry<SpecialUnitHandler> handlers;
-	private final UnitConverter compound;
-	
-	private Factor one = new Factor(1);
-
-	/**
-	 * @param model
-	 */
-	public UcumConverter(UcumModel model, Registry handlers) {
-		super();
-		this.model = model;
-		this.handlers = handlers;
-		List<UnitConverter> compounds = getCompoundConverters();
-		compound = compounds.get(0);
-	}
-
-	public Canonical convert(Term term) throws UOMoRuntimeException {
-		return convertTerm(term);
-	}
-
-	private Canonical convertTerm(Term term) throws UOMoRuntimeException {
-		Canonical res = new Canonical(BigDecimal.ONE, new Term());
-		if (term.hasComp())
-			res.getUnit().setComp(convertComp(res, term.getComp()));
-		if (term.hasOp())
-			res.getUnit().setOp(term.getOp());
-		if (term.hasTerm()) {
-			Canonical t = convertTerm(term.getTerm());
-			res.setValue(res.getValue().multiply(t.getValue()));
-			if (t.hasUnit())
-				res.getUnit().setTermCheckOp(t.getUnit());
-			else
-				res.getUnit().setOp(null);
-		}
-
-		// normalise
-		debug("normalise", res.getUnit()); //$NON-NLS-1$
-		if (res.getUnit().hasOp() && res.getUnit().getOp() == DIVISION) {
-			res.getUnit().setOp(MULTIPLICATION);
-			flipExponents(res.getUnit().getTerm());
-			debug("flipped", res.getUnit()); //$NON-NLS-1$
-		}
-
-		if (!res.getUnit().hasComp() || res.getUnit().getComp() == one) {
-			res.setUnit(res.getUnit().getTerm());
-			debug("trimmed", res.getUnit()); //$NON-NLS-1$
-		}
-
-		// everything in scope is a multiplication operation. If comp is a term,
-		// then
-		// we are going to tack our term on the end of that term as a
-		// multiplication, and
-		// make comp our term
-
-		if (res.hasUnit() && res.getUnit().hasComp()
-				&& res.getUnit().getComp() instanceof Term) {
-			Term end = getEndTerm((Term) res.getUnit().getComp());
-			assert end.getOp() == null;
-			end.setOp(MULTIPLICATION);
-			end.setTermCheckOp(res.getUnit().getTerm());
-			res.setUnit((Term) res.getUnit().getComp());
-			debug("reorged", res.getUnit()); //$NON-NLS-1$
-		}
-
-		if (res.hasUnit()
-				&& (!res.getUnit().hasComp() || res.getUnit().getComp() == one)) {
-			res.setUnit(res.getUnit().getTerm());
-			debug("trimmed", res.getUnit()); //$NON-NLS-1$
-		}
-		// now we have a linear list of terms, each with one component.
-		// we scan through the list looking for common components to factor out
-		// we have to scan into the list because we may have deep duplicates
-		// from the previous flattening operation. we also remove anything
-		// that's
-		// ended up with an exponent of 0 during this operation
-		if (res.hasUnit())
-			res.setUnit(removeDuplicateComponents(res.getUnit()));
-
-		if (res.hasUnit() && !res.getUnit().hasTerm())
-			res.getUnit().setOp(null);
-		debug("norm finished", res.getUnit()); //$NON-NLS-1$
-		// System.out.println("value: "+res.getValue().toPlainString()+"; units: "+new
-		// ExpressionComposer().compose(res.getUnit()));
-		return res;
-	}
-
-	private void debug(String state, Term unit) {
-		if (isConsoleOutput()) { // avoiding any call if no debug output set
-			println(state + ": " + new ExpressionComposer().compose(unit)); //$NON-NLS-1$
-		}
-	}
-
-	private Term getEndTerm(Term term) {
-		if (term.hasTerm())
-			return getEndTerm(term.getTerm());
-		else
-			return term;
-	}
-
-	private Term removeDuplicateComponents(Term unit) {
-		if (unit == null)
-			return null;
-		assert unit.getComp() instanceof Symbol; // because that should be all
-													// that's left
-		Symbol symO = (Symbol) unit.getComp();
-		Term inner = findDuplicateCompOwner(unit.getTerm(), symO);
-		if (inner != null) {
-			Symbol symI = (Symbol) inner.getComp();
-			symI.setExponent(symI.getExponent() + symO.getExponent());
-			return removeDuplicateComponents(unit.getTerm());
-		}
-		if (symO.getExponent() == 0)
-			return removeDuplicateComponents(unit.getTerm());
-		unit.setTermCheckOp(removeDuplicateComponents(unit.getTerm()));
-		return unit;
-	}
-
-	private Term findDuplicateCompOwner(Term term, Symbol comp) {
-		if (term == null)
-			return null;
-		if (term.getComp() instanceof Symbol) {
-			Symbol sym = (Symbol) term.getComp();
-			if (sym.getPrefix() == comp.getPrefix() && // i.e. null
-					sym.getUnit() == comp.getUnit())
-				return term;
-		}
-		return findDuplicateCompOwner(term.getTerm(), comp);
-	}
-
-	private void flipExponents(Term term) {
-		if (term.getComp() instanceof Symbol) {
-			((Symbol) term.getComp()).invertExponent();
-		}
-		if (term.hasTerm()) {
-			flipExponents(term.getTerm());
-		}
-	}
-
-	private Component convertComp(Canonical ctxt, Component comp)
-			throws UOMoRuntimeException {
-		if (comp instanceof Term) {
-			Canonical t = convertTerm((Term) comp);
-			ctxt.multiplyValue(t.getValue());
-			return t.getUnit();
-		} else if (comp instanceof Factor) {
-			ctxt.multiplyValue(((Factor) comp).getValue());
-			return one; // nothing to convert
-		} else if (comp instanceof Symbol)
-			return convertSymbol(ctxt, (Symbol) comp);
-		else
-			throw new UOMoRuntimeException("unknown component type " //$NON-NLS-1$
-					+ comp.getClass().toString());
-	}
-
-	private Component convertSymbol(Canonical ctxt, Symbol comp)
-			throws UOMoRuntimeException {
-		if (comp.hasPrefix()) {
-//			ctxt.multiplyValue(comp.getPrefix().getValue());
-			ctxt.multiplyValue(((BigDecimal)comp.getPrefix().getValue()).pow(
-					comp.getExponent(),	MathContext.DECIMAL128));
-		}
-
-		if (comp.getUnit().getKind() == BASEUNIT) {
-			Symbol res = new Symbol();
-			res.setUnit(comp.getUnit());
-			res.setExponent(comp.getExponent());
-			return res;
-		} else {
-			DefinedUnit unit = (DefinedUnit) comp.getUnit();
-			String u = unit.getValue().getUnit();
-			if (unit.isSpecial()) {
-				if (!handlers.exists(unit.getCode()))
-					throw new UOMoRuntimeException("Not handled yet (special unit)"); //$NON-NLS-1$
-				else {
-					u = handlers.get(unit.getCode()).getUnits();
-					ctxt.multiplyValue(handlers.get(unit.getCode()).value());
-				}
-			} else
-				ctxt.multiplyValue(unit.getValue().value());
-			Term canonical = new ExpressionParser(model).parse(u);
-			if (canonical.hasComp() && !canonical.hasOp()
-					&& !canonical.hasTerm()) {
-				Component ret = convertComp(ctxt, canonical.getComp());
-				if (comp.getExponent() == 1)
-					return ret;
-				else if (ret instanceof Factor) {
-					((Factor) ret).setValue(comp.getExponent()
-							+ ((Factor) ret).getValue());
-					return ret;
-				} else if (ret instanceof Symbol) {
-					((Symbol) ret).setExponent(comp.getExponent()
-							* ((Symbol) ret).getExponent());
-					return ret;
-				} else if (ret instanceof Term) {
-					applyExponent((Term) ret, comp.getExponent());
-					return ret;
-				} else
-					throw new UOMoRuntimeException("unknown component type " //$NON-NLS-1$
-							+ comp.getClass().toString());
-			} else {
-				Canonical t1 = convertTerm(canonical);
-				Term ret = t1.getUnit();
-				if (comp.getExponent() == -1 && ret.hasComp() && ret.hasOp()
-						&& ret.hasTerm() && ret.getTerm().hasComp()
-						&& !ret.getTerm().hasOp() && !ret.getTerm().hasTerm()) {
-					Component t = ret.getTerm().getComp();
-					ret.getTerm().setComp(ret.getComp());
-					ret.setComp(t);
-					ctxt.divideValue(t1.getValue());
-					return ret;
-				} else if (comp.getExponent() != 1) {
-					ctxt.multiplyValue(t1.getValue());
-					// what we have to do is push the exponent into the all the
-					// symbols contained herein
-					applyExponent(ret, comp.getExponent());
-					return ret;
-				} else {
-					ctxt.multiplyValue(t1.getValue());
-					return ret;
-				}
-			}
-		}
-	}
-
-	private void applyExponent(Term term, int exponent) {
-		if (term == null)
-			return;
-		if (term.hasComp()) {
-			if (term.getComp() instanceof Term) {
-				applyExponent((Term) term.getComp(), exponent);
-			} else if (term.getComp() instanceof Symbol) {
-				Symbol sym = (Symbol) term.getComp();
-				sym.setExponent(sym.getExponent() * exponent);
-			}
-
-		}
-		applyExponent(term.getTerm(), exponent);
-	}
-
-	public UnitConverter concatenate(UnitConverter converter) {
-		return compound.concatenate(converter);
-	}
-
-	public double convert(double value) {
-		return compound.convert(value);
-	}
-
-	public BigDecimal convert(BigDecimal value, MathContext ctx)
-			throws ArithmeticException {
-		return compound.convert(value, ctx);
-	}
-
-	public List<UnitConverter> getCompoundConverters() {
-		final List<UnitConverter> compound = new ArrayList<UnitConverter>();
-		compound.add(this);
-		return compound;
-	}
-
-	public UnitConverter inverse() {
-		return compound.inverse();
-	}
-
-	public boolean isIdentity() {
-		return false;
-	}
-
-	public boolean isLinear() {
-		return false;
-	}
-
-	public Number convert(Number value) {
-		return compound.convert(value);
-	}
-}
+/*******************************************************************************
+ * Crown Copyright (c) 2006, 2011, Copyright (c) 2006, 2008 Kestral Computing P/L.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *    Kestral Computing P/L - initial implementation
+ *    
+ *******************************************************************************/
+
+package org.eclipse.uomo.ucum.impl;
+
+import static org.eclipse.uomo.core.impl.OutputHelper.isConsoleOutput;
+import static org.eclipse.uomo.core.impl.OutputHelper.println;
+import static org.eclipse.uomo.ucum.model.ConceptKind.*;
+import static org.eclipse.uomo.ucum.expression.Operator.*;
+
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.uomo.core.UOMoRuntimeException;
+import org.eclipse.uomo.ucum.expression.Component;
+import org.eclipse.uomo.ucum.expression.Factor;
+import org.eclipse.uomo.ucum.expression.Symbol;
+import org.eclipse.uomo.ucum.expression.Term;
+import org.eclipse.uomo.ucum.model.DefinedUnit;
+import org.eclipse.uomo.ucum.model.UcumModel;
+import org.eclipse.uomo.ucum.parsers.ExpressionComposer;
+import org.eclipse.uomo.ucum.parsers.ExpressionParser;
+import org.eclipse.uomo.ucum.special.SpecialUnitHandler;
+import org.eclipse.uomo.units.AbstractConverter;
+import org.eclipse.uomo.util.Registry;
+import org.unitsofmeasurement.unit.UnitConverter;
+
+/**
+ * = [mu_0] = 4.[pi].10*-7.N/A2 = (g.m/s2)/(C/s)2? = g.m/s2/(C2/s2) =
+ * g.m/s2/C2.s2 = g.m/C2.s2/s2 = g.m/C2 = m.g.C-2
+ * 
+ * @author Grahame Grieve
+ * @author Werner Keil
+ */
+class UcumConverter extends AbstractConverter {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -895607408258138526L;
+	private final UcumModel model;
+	@SuppressWarnings("rawtypes")
+	private final Registry<SpecialUnitHandler> handlers;
+	private final UnitConverter compound;
+	
+	private Factor one = new Factor(1);
+
+	/**
+	 * @param model
+	 */
+	public UcumConverter(UcumModel model, Registry handlers) {
+		super();
+		this.model = model;
+		this.handlers = handlers;
+		List<UnitConverter> compounds = getCompoundConverters();
+		compound = compounds.get(0);
+	}
+
+	public Canonical convert(Term term) throws UOMoRuntimeException {
+		return convertTerm(term);
+	}
+
+	private Canonical convertTerm(Term term) throws UOMoRuntimeException {
+		Canonical res = new Canonical(BigDecimal.ONE, new Term());
+		if (term.hasComp())
+			res.getUnit().setComp(convertComp(res, term.getComp()));
+		if (term.hasOp())
+			res.getUnit().setOp(term.getOp());
+		if (term.hasTerm()) {
+			Canonical t = convertTerm(term.getTerm());
+			res.setValue(res.getValue().multiply(t.getValue()));
+			if (t.hasUnit())
+				res.getUnit().setTermCheckOp(t.getUnit());
+			else
+				res.getUnit().setOp(null);
+		}
+
+		// normalise
+		debug("normalise", res.getUnit()); //$NON-NLS-1$
+		if (res.getUnit().hasOp() && res.getUnit().getOp() == DIVISION) {
+			res.getUnit().setOp(MULTIPLICATION);
+			flipExponents(res.getUnit().getTerm());
+			debug("flipped", res.getUnit()); //$NON-NLS-1$
+		}
+
+		if (!res.getUnit().hasComp() || res.getUnit().getComp() == one) {
+			res.setUnit(res.getUnit().getTerm());
+			debug("trimmed", res.getUnit()); //$NON-NLS-1$
+		}
+
+		// everything in scope is a multiplication operation. If comp is a term,
+		// then
+		// we are going to tack our term on the end of that term as a
+		// multiplication, and
+		// make comp our term
+
+		if (res.hasUnit() && res.getUnit().hasComp()
+				&& res.getUnit().getComp() instanceof Term) {
+			Term end = getEndTerm((Term) res.getUnit().getComp());
+			assert end.getOp() == null;
+			end.setOp(MULTIPLICATION);
+			end.setTermCheckOp(res.getUnit().getTerm());
+			res.setUnit((Term) res.getUnit().getComp());
+			debug("reorged", res.getUnit()); //$NON-NLS-1$
+		}
+
+		if (res.hasUnit()
+				&& (!res.getUnit().hasComp() || res.getUnit().getComp() == one)) {
+			res.setUnit(res.getUnit().getTerm());
+			debug("trimmed", res.getUnit()); //$NON-NLS-1$
+		}
+		// now we have a linear list of terms, each with one component.
+		// we scan through the list looking for common components to factor out
+		// we have to scan into the list because we may have deep duplicates
+		// from the previous flattening operation. we also remove anything
+		// that's
+		// ended up with an exponent of 0 during this operation
+		if (res.hasUnit())
+			res.setUnit(removeDuplicateComponents(res.getUnit()));
+
+		if (res.hasUnit() && !res.getUnit().hasTerm())
+			res.getUnit().setOp(null);
+		debug("norm finished", res.getUnit()); //$NON-NLS-1$
+		// System.out.println("value: "+res.getValue().toPlainString()+"; units: "+new
+		// ExpressionComposer().compose(res.getUnit()));
+		return res;
+	}
+
+	private void debug(String state, Term unit) {
+		if (isConsoleOutput()) { // avoiding any call if no debug output set
+			println(state + ": " + new ExpressionComposer().compose(unit)); //$NON-NLS-1$
+		}
+	}
+
+	private Term getEndTerm(Term term) {
+		if (term.hasTerm())
+			return getEndTerm(term.getTerm());
+		else
+			return term;
+	}
+
+	private Term removeDuplicateComponents(Term unit) {
+		if (unit == null)
+			return null;
+		assert unit.getComp() instanceof Symbol; // because that should be all
+													// that's left
+		Symbol symO = (Symbol) unit.getComp();
+		Term inner = findDuplicateCompOwner(unit.getTerm(), symO);
+		if (inner != null) {
+			Symbol symI = (Symbol) inner.getComp();
+			symI.setExponent(symI.getExponent() + symO.getExponent());
+			return removeDuplicateComponents(unit.getTerm());
+		}
+		if (symO.getExponent() == 0)
+			return removeDuplicateComponents(unit.getTerm());
+		unit.setTermCheckOp(removeDuplicateComponents(unit.getTerm()));
+		return unit;
+	}
+
+	private Term findDuplicateCompOwner(Term term, Symbol comp) {
+		if (term == null)
+			return null;
+		if (term.getComp() instanceof Symbol) {
+			Symbol sym = (Symbol) term.getComp();
+			if (sym.getPrefix() == comp.getPrefix() && // i.e. null
+					sym.getUnit() == comp.getUnit())
+				return term;
+		}
+		return findDuplicateCompOwner(term.getTerm(), comp);
+	}
+
+	private void flipExponents(Term term) {
+		if (term.getComp() instanceof Symbol) {
+			((Symbol) term.getComp()).invertExponent();
+		}
+		if (term.hasTerm()) {
+			flipExponents(term.getTerm());
+		}
+	}
+
+	private Component convertComp(Canonical ctxt, Component comp)
+			throws UOMoRuntimeException {
+		if (comp instanceof Term) {
+			Canonical t = convertTerm((Term) comp);
+			ctxt.multiplyValue(t.getValue());
+			return t.getUnit();
+		} else if (comp instanceof Factor) {
+			ctxt.multiplyValue(((Factor) comp).getValue());
+			return one; // nothing to convert
+		} else if (comp instanceof Symbol)
+			return convertSymbol(ctxt, (Symbol) comp);
+		else
+			throw new UOMoRuntimeException("unknown component type " //$NON-NLS-1$
+					+ comp.getClass().toString());
+	}
+
+	private Component convertSymbol(Canonical ctxt, Symbol comp)
+			throws UOMoRuntimeException {
+		if (comp.hasPrefix()) {
+//			ctxt.multiplyValue(comp.getPrefix().getValue());
+			ctxt.multiplyValue(((BigDecimal)comp.getPrefix().getValue()).pow(
+					comp.getExponent(),	MathContext.DECIMAL128));
+		}
+
+		if (comp.getUnit().getKind() == BASEUNIT) {
+			Symbol res = new Symbol();
+			res.setUnit(comp.getUnit());
+			res.setExponent(comp.getExponent());
+			return res;
+		} else {
+			DefinedUnit unit = (DefinedUnit) comp.getUnit();
+			String u = unit.getValue().getUnit();
+			if (unit.isSpecial()) {
+				if (!handlers.exists(unit.getCode()))
+					throw new UOMoRuntimeException("Not handled yet (special unit)"); //$NON-NLS-1$
+				else {
+					u = handlers.get(unit.getCode()).getUnits();
+					ctxt.multiplyValue(handlers.get(unit.getCode()).value());
+				}
+			} else
+				ctxt.multiplyValue(unit.getValue().value());
+			Term canonical = new ExpressionParser(model).parse(u);
+			if (canonical.hasComp() && !canonical.hasOp()
+					&& !canonical.hasTerm()) {
+				Component ret = convertComp(ctxt, canonical.getComp());
+				if (comp.getExponent() == 1)
+					return ret;
+				else if (ret instanceof Factor) {
+					((Factor) ret).setValue(comp.getExponent()
+							+ ((Factor) ret).getValue());
+					return ret;
+				} else if (ret instanceof Symbol) {
+					((Symbol) ret).setExponent(comp.getExponent()
+							* ((Symbol) ret).getExponent());
+					return ret;
+				} else if (ret instanceof Term) {
+					applyExponent((Term) ret, comp.getExponent());
+					return ret;
+				} else
+					throw new UOMoRuntimeException("unknown component type " //$NON-NLS-1$
+							+ comp.getClass().toString());
+			} else {
+				Canonical t1 = convertTerm(canonical);
+				Term ret = t1.getUnit();
+				if (comp.getExponent() == -1 && ret.hasComp() && ret.hasOp()
+						&& ret.hasTerm() && ret.getTerm().hasComp()
+						&& !ret.getTerm().hasOp() && !ret.getTerm().hasTerm()) {
+					Component t = ret.getTerm().getComp();
+					ret.getTerm().setComp(ret.getComp());
+					ret.setComp(t);
+					ctxt.divideValue(t1.getValue());
+					return ret;
+				} else if (comp.getExponent() != 1) {
+					ctxt.multiplyValue(t1.getValue());
+					// what we have to do is push the exponent into the all the
+					// symbols contained herein
+					applyExponent(ret, comp.getExponent());
+					return ret;
+				} else {
+					ctxt.multiplyValue(t1.getValue());
+					return ret;
+				}
+			}
+		}
+	}
+
+	private void applyExponent(Term term, int exponent) {
+		if (term == null)
+			return;
+		if (term.hasComp()) {
+			if (term.getComp() instanceof Term) {
+				applyExponent((Term) term.getComp(), exponent);
+			} else if (term.getComp() instanceof Symbol) {
+				Symbol sym = (Symbol) term.getComp();
+				sym.setExponent(sym.getExponent() * exponent);
+			}
+
+		}
+		applyExponent(term.getTerm(), exponent);
+	}
+
+	public UnitConverter concatenate(UnitConverter converter) {
+		return compound.concatenate(converter);
+	}
+
+	public double convert(double value) {
+		return compound.convert(value);
+	}
+
+	public BigDecimal convert(BigDecimal value, MathContext ctx)
+			throws ArithmeticException {
+		return compound.convert(value, ctx);
+	}
+
+	public List<UnitConverter> getCompoundConverters() {
+		final List<UnitConverter> compound = new ArrayList<UnitConverter>();
+		compound.add(this);
+		return compound;
+	}
+
+	public UnitConverter inverse() {
+		return compound.inverse();
+	}
+
+	public boolean isIdentity() {
+		return false;
+	}
+
+	public boolean isLinear() {
+		return false;
+	}
+
+	public Number convert(Number value) {
+		return compound.convert(value);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/impl/UcumEssenceService.java b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/impl/UcumEssenceService.java
index dbcec29..73d1c96 100644
--- a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/impl/UcumEssenceService.java
+++ b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/impl/UcumEssenceService.java
@@ -1,377 +1,377 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2014 Werner Keil, Creative Arts & Technologies. 
- * Crown Copyright (c) 2006, 2008, Copyright (c) 2006, 2008 Kestral Computing P/L.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *    Kestral Computing P/L - initial implementation
- *    Werner Keil - fixes and improvements
- *******************************************************************************/
-
-package org.eclipse.uomo.ucum.impl;
-
-import static org.eclipse.uomo.core.impl.OutputHelper.println;
-
-import java.io.File;
-import java.io.InputStream;
-import java.math.BigDecimal;
-import java.math.MathContext;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.uomo.core.UOMoRuntimeException;
-import org.eclipse.uomo.core.impl.CodeValuePair;
-import org.eclipse.uomo.ucum.UcumService;
-import org.eclipse.uomo.ucum.expression.Symbol;
-import org.eclipse.uomo.ucum.expression.Term;
-import org.eclipse.uomo.ucum.model.BaseUnit;
-import org.eclipse.uomo.ucum.model.Concept;
-import org.eclipse.uomo.ucum.model.ConceptKind;
-import org.eclipse.uomo.ucum.model.DefinedUnit;
-import org.eclipse.uomo.ucum.model.UcumModel;
-import org.eclipse.uomo.ucum.parsers.DefinitionParser;
-import org.eclipse.uomo.ucum.parsers.ExpressionComposer;
-import org.eclipse.uomo.ucum.parsers.ExpressionParser;
-import org.eclipse.uomo.ucum.parsers.FormalStructureComposer;
-import org.eclipse.uomo.ucum.special.SpecialUnitHandler;
-import org.eclipse.uomo.ucum.special.SpecialUnitRegistry;
-import org.eclipse.uomo.util.Registry;
-
-/**
- * implements UCUM services. Applications must provide a copy of
- * ucum-essence.xml as either a stream or a file name to create the services.
- * 
- * the provided ucum-essence.xml must be released on 25 Apr 2008 or more recent.
- * Note that if the ucum-essence.xml file does not contain a release date on an
- * attribute of the root element, it is not more recent than this date (Gunther
- * added it on this date for this usage, thanks)
- * 
- * @author Grahame Grieve
- * @author Werner Keil
- */
-public class UcumEssenceService implements UcumService {
-
-	/**
-	 * UCUM ID
-	 */
-	public static final String UCUM_OID = "2.16.840.1.113883.6.8";
-
-	private final UcumModel model;
-	@SuppressWarnings("rawtypes")
-	private final Registry<SpecialUnitHandler> handlers = new SpecialUnitRegistry();
-
-	/**
-	 * Create an instance of Ucum services. Stream must point to a valid
-	 * ucum-essence file (see class documentation)
-	 */
-	public UcumEssenceService(InputStream stream) throws UOMoRuntimeException {
-		super();
-		assert stream != null : paramError("factory", "stream",
-				"must not be null");
-		try {
-			model = new DefinitionParser().parse(stream);
-		} catch (Exception e) {
-			throw new UOMoRuntimeException(e);
-		}
-	}
-
-	/**
-	 * Create an instance of Ucum services. filename must point to a valid
-	 * ucum-essence file (see class documentation)
-	 */
-	public UcumEssenceService(String filename) throws UOMoRuntimeException {
-		super();
-		assert new File(filename).exists() : paramError("factory", "file",
-				"must exist");
-		try {
-			model = new DefinitionParser().parse(filename);
-		} catch (Exception e) {
-			throw new UOMoRuntimeException(e);
-		}
-	}
-
-	private String paramError(String method, String param, String msg) {
-		return getClass().getName() + "." + method + "." + param
-				+ " is not acceptable: " + msg;
-	}
-
-	public UcumVersionDetails ucumIdentification() {
-		return new UcumVersionDetails(model.getRevisionDate(),
-				model.getVersion());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.uomo.ucum.UcumServiceEx#getModel()
-	 */
-	public UcumModel getModel() {
-		return model;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.uomo.ucum.UcumServiceEx#search(org.eclipse.uomo.ucum.model.
-	 * ConceptKind, java.lang.String, boolean)
-	 */
-	public List<Concept> search(ConceptKind kind, String text, boolean isRegex) {
-		assert checkStringParam(text) : paramError("search", "text",
-				"must not be null or empty");
-		return new SearchImpl().doSearch(model, kind, text, isRegex);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.uomo.ucum.UcumService#validateUCUM()
-	 */
-	public List<String> validateUCUM() {
-		return new UcumValidator(model, handlers).validate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.uomo.ucum.UcumService#getProperties()
-	 */
-	public Set<String> getProperties() {
-		Set<String> result = new HashSet<String>();
-		for (DefinedUnit unit : model.getDefinedUnits()) {
-			result.add(unit.getProperty());
-		}
-		for (BaseUnit unit : model.getBaseUnits()) {
-			result.add(unit.getProperty());
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ohf.ucum.UcumServiceEx#validate(java.lang.String)
-	 */
-	public String validate(String unit) {
-		assert unit != null : paramError("validate", "unit", "must not be null");
-		try {
-			new ExpressionParser(model).parse(unit);
-			return null;
-		} catch (UOMoRuntimeException e) {
-			return e.getMessage();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ohf.ucum.UcumServiceEx#validateInProperty(java.lang.String,
-	 * java.lang.String)
-	 */
-	public String validateInProperty(String unit, String property) {
-		assert checkStringParam(unit) : paramError("validate", "unit",
-				"must not be null or empty");
-		assert checkStringParam(property) : paramError("validateInProperty",
-				"property", "must not be null or empty");
-		try {
-			Term term = new ExpressionParser(model).parse(unit);
-			Canonical can = new UcumConverter(model, handlers).convert(term);
-			term = can.getUnit();
-			String cu = new ExpressionComposer().compose(term);
-			if (term.hasComp() && !term.hasOp()
-					&& term.getComp() instanceof Symbol) {
-				Symbol sym = (Symbol) term.getComp();
-				if (sym.getExponent() == 1 && sym.getUnit() instanceof BaseUnit) {
-					BaseUnit b = (BaseUnit) sym.getUnit();
-					if (property.equals(b.getProperty()))
-						return null;
-					else
-						return "unit " + unit + " is of the property type "
-								+ b.getProperty() + " (" + cu + "), not "
-								+ property + " as required.";
-				}
-			}
-			// defined special case
-			if ("concentration".equals(property)
-					&& ("g/L".equals(cu) || "mol/L".equals(cu)))
-				return null;
-
-			return "unit " + unit + " has the base units " + cu
-					+ ", and are not from the property " + property
-					+ " as required.";
-		} catch (UOMoRuntimeException e) {
-			return e.getMessage();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ohf.ucum.UcumServiceEx#validateCanonicalUnits(java.lang.String
-	 * , java.lang.String)
-	 */
-	public String validateCanonicalUnits(String unit, String canonical) {
-		assert checkStringParam(unit) : paramError("validate", "unit",
-				"must not be null or empty");
-		assert checkStringParam(canonical) : paramError(
-				"validateCanonicalUnits", "canonical",
-				"must not be null or empty");
-		try {
-			Term term = new ExpressionParser(model).parse(unit);
-			Canonical can = new UcumConverter(model, handlers).convert(term);
-			term = can.getUnit();
-			String cu = new ExpressionComposer().compose(term);
-			if (!canonical.equals(cu))
-				return "unit " + unit + " has the base units " + cu + ", not "
-						+ canonical + " as required.";
-			return null;
-		} catch (UOMoRuntimeException e) {
-			return e.getMessage();
-		}
-	}
-
-	/**
-	 * given a unit, return a formal description of what the units stand for
-	 * using full names
-	 * 
-	 * @param units
-	 *            the unit code
-	 * @return formal description
-	 * @throws UOMoRuntimeException
-	 */
-	public String analyse(String unit) throws UOMoRuntimeException {
-		assert checkStringParam(unit) : paramError("analyse", "unit",
-				"must not be null or empty");
-		Term term = new ExpressionParser(model).parse(unit);
-		return new FormalStructureComposer().compose(term);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ohf.ucum.UcumServiceEx#getCanonicalUnits(java.lang.String)
-	 */
-	public String getCanonicalUnits(String unit) throws UOMoRuntimeException {
-		assert checkStringParam(unit) : paramError("getCanonicalUnits", "unit",
-				"must not be null or empty");
-		try {
-			Term term = new ExpressionParser(model).parse(unit);
-			term = new UcumConverter(model, handlers).convert(term).getUnit();
-			return new ExpressionComposer().compose(term);
-		} catch (RuntimeException e) {
-			throw new UOMoRuntimeException("Error processing " + unit + ": "
-					+ e.getMessage(), e);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.uomo.ucum.UcumServiceEx#getDefinedForms(java.lang.String)
-	 */
-	public List<DefinedUnit> getDefinedForms(String code)
-			throws UOMoRuntimeException {
-		assert checkStringParam(code) : paramError("getDefinedForms", "code",
-				"must not be null or empty");
-		List<DefinedUnit> result = new ArrayList<DefinedUnit>();
-		BaseUnit base = model.getBaseUnit(code);
-		if (base != null) {
-			for (DefinedUnit unit : model.getDefinedUnits()) {
-				if (!unit.isSpecial()
-						&& code.equals(getCanonicalUnits(unit.getCode())))
-					result.add(unit);
-			}
-		}
-		return result;
-	}
-
-	private boolean checkStringParam(String s) {
-		return s != null && !s.equals("");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ohf.ucum.UcumServiceEx#getCanonicalForm(org.eclipse.ohf.ucum
-	 * .UcumEssenceService.Pair)
-	 */
-	public CodeValuePair<Number, String> getCanonicalForm(CodeValuePair<Number, String> value)
-			throws UOMoRuntimeException {
-		assert value != null : paramError("getCanonicalForm", "value",
-				"must not be null");
-		assert checkStringParam(value.getCode()) : paramError(
-				"getCanonicalForm", "value.code", "must not be null or empty");
-
-		Term term = new ExpressionParser(model).parse(value.getCode());
-		Canonical c = new UcumConverter(model, handlers).convert(term);
-		if (value.getValue() == null)
-			return new CodeValuePair<Number, String>(null,
-					new ExpressionComposer().compose(c.getUnit()));
-		else
-			return new CodeValuePair<Number, String>(
-					((BigDecimal) value.getValue()).multiply(c.getValue()),
-					new ExpressionComposer().compose(c.getUnit()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.uomo.ucum.UcumServiceEx#convert(java.lang.Number,
-	 * java.lang.String, java.lang.String)
-	 */
-	public Number convert(final Number value, String sourceUnit, String destUnit)
-			throws UOMoRuntimeException {
-		assert value != null : paramError("convert", "value",
-				"must not be null");
-		assert checkStringParam(sourceUnit) : paramError("convert",
-				"sourceUnit", "must not be null or empty");
-		assert checkStringParam(destUnit) : paramError("convert", "destUnit",
-				"must not be null or empty");
-
-		if (sourceUnit.equals(destUnit))
-			return value;
-
-		Canonical src = new UcumConverter(model, handlers)
-				.convert(new ExpressionParser(model).parse(sourceUnit));
-		Canonical dst = new UcumConverter(model, handlers)
-				.convert(new ExpressionParser(model).parse(destUnit));
-		String s = new ExpressionComposer().compose(src.getUnit());
-		String d = new ExpressionComposer().compose(dst.getUnit());
-		if (!s.equals(d))
-			throw new UOMoRuntimeException("Unable to convert between units "
-					+ sourceUnit + " and " + destUnit
-					+ " as they do not have matching canonical forms (" + s
-					+ " and " + d + " respectively)");
-		final BigDecimal decValue = (BigDecimal) value;
-		final BigDecimal canValue = decValue.multiply(src.getValue());
-		final BigDecimal result = canValue.divide(dst.getValue(), new MathContext(25));
-		println(decValue.toPlainString() + sourceUnit + " =("
-				+ src.getValue().toPlainString() + ")= "
-				+ canValue.toPlainString() + s + " =("
-				+ dst.getValue().toPlainString() + ")= "
-				+ result);
-		return result;
-	}
-
-	public CodeValuePair<Number, String> multiply(CodeValuePair<Number, String> o1,
-			CodeValuePair<Number, String> o2) {
-		// Term term = new ExpressionParser(model).parse(o1.getCode());
-		// Canonical c = new Converter(model, handlers).convert(term);
-		return new CodeValuePair<Number, String>(
-				((BigDecimal) o1.getValue()).multiply((BigDecimal) o2
-						.getValue()),
-				// new ExpressionComposer().compose(c.getUnit()));
-				o1.getCode() + "." + o2.getCode());
-	}
-
-}
+/*******************************************************************************
+ * Copyright (c) 2010, 2014 Werner Keil, Creative Arts & Technologies. 
+ * Crown Copyright (c) 2006, 2008, Copyright (c) 2006, 2008 Kestral Computing P/L.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *    Kestral Computing P/L - initial implementation
+ *    Werner Keil - fixes and improvements
+ *******************************************************************************/
+
+package org.eclipse.uomo.ucum.impl;
+
+import static org.eclipse.uomo.core.impl.OutputHelper.println;
+
+import java.io.File;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.uomo.core.UOMoRuntimeException;
+import org.eclipse.uomo.core.impl.CodeValuePair;
+import org.eclipse.uomo.ucum.UcumService;
+import org.eclipse.uomo.ucum.expression.Symbol;
+import org.eclipse.uomo.ucum.expression.Term;
+import org.eclipse.uomo.ucum.model.BaseUnit;
+import org.eclipse.uomo.ucum.model.Concept;
+import org.eclipse.uomo.ucum.model.ConceptKind;
+import org.eclipse.uomo.ucum.model.DefinedUnit;
+import org.eclipse.uomo.ucum.model.UcumModel;
+import org.eclipse.uomo.ucum.parsers.DefinitionParser;
+import org.eclipse.uomo.ucum.parsers.ExpressionComposer;
+import org.eclipse.uomo.ucum.parsers.ExpressionParser;
+import org.eclipse.uomo.ucum.parsers.FormalStructureComposer;
+import org.eclipse.uomo.ucum.special.SpecialUnitHandler;
+import org.eclipse.uomo.ucum.special.SpecialUnitRegistry;
+import org.eclipse.uomo.util.Registry;
+
+/**
+ * implements UCUM services. Applications must provide a copy of
+ * ucum-essence.xml as either a stream or a file name to create the services.
+ * 
+ * the provided ucum-essence.xml must be released on 25 Apr 2008 or more recent.
+ * Note that if the ucum-essence.xml file does not contain a release date on an
+ * attribute of the root element, it is not more recent than this date (Gunther
+ * added it on this date for this usage, thanks)
+ * 
+ * @author Grahame Grieve
+ * @author Werner Keil
+ */
+public class UcumEssenceService implements UcumService {
+
+	/**
+	 * UCUM ID
+	 */
+	public static final String UCUM_OID = "2.16.840.1.113883.6.8";
+
+	private final UcumModel model;
+	@SuppressWarnings("rawtypes")
+	private final Registry<SpecialUnitHandler> handlers = new SpecialUnitRegistry();
+
+	/**
+	 * Create an instance of Ucum services. Stream must point to a valid
+	 * ucum-essence file (see class documentation)
+	 */
+	public UcumEssenceService(InputStream stream) throws UOMoRuntimeException {
+		super();
+		assert stream != null : paramError("factory", "stream",
+				"must not be null");
+		try {
+			model = new DefinitionParser().parse(stream);
+		} catch (Exception e) {
+			throw new UOMoRuntimeException(e);
+		}
+	}
+
+	/**
+	 * Create an instance of Ucum services. filename must point to a valid
+	 * ucum-essence file (see class documentation)
+	 */
+	public UcumEssenceService(String filename) throws UOMoRuntimeException {
+		super();
+		assert new File(filename).exists() : paramError("factory", "file",
+				"must exist");
+		try {
+			model = new DefinitionParser().parse(filename);
+		} catch (Exception e) {
+			throw new UOMoRuntimeException(e);
+		}
+	}
+
+	private String paramError(String method, String param, String msg) {
+		return getClass().getName() + "." + method + "." + param
+				+ " is not acceptable: " + msg;
+	}
+
+	public UcumVersionDetails ucumIdentification() {
+		return new UcumVersionDetails(model.getRevisionDate(),
+				model.getVersion());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.uomo.ucum.UcumServiceEx#getModel()
+	 */
+	public UcumModel getModel() {
+		return model;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.uomo.ucum.UcumServiceEx#search(org.eclipse.uomo.ucum.model.
+	 * ConceptKind, java.lang.String, boolean)
+	 */
+	public List<Concept> search(ConceptKind kind, String text, boolean isRegex) {
+		assert checkStringParam(text) : paramError("search", "text",
+				"must not be null or empty");
+		return new SearchImpl().doSearch(model, kind, text, isRegex);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.uomo.ucum.UcumService#validateUCUM()
+	 */
+	public List<String> validateUCUM() {
+		return new UcumValidator(model, handlers).validate();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.uomo.ucum.UcumService#getProperties()
+	 */
+	public Set<String> getProperties() {
+		Set<String> result = new HashSet<String>();
+		for (DefinedUnit unit : model.getDefinedUnits()) {
+			result.add(unit.getProperty());
+		}
+		for (BaseUnit unit : model.getBaseUnits()) {
+			result.add(unit.getProperty());
+		}
+		return result;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ohf.ucum.UcumServiceEx#validate(java.lang.String)
+	 */
+	public String validate(String unit) {
+		assert unit != null : paramError("validate", "unit", "must not be null");
+		try {
+			new ExpressionParser(model).parse(unit);
+			return null;
+		} catch (UOMoRuntimeException e) {
+			return e.getMessage();
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.ohf.ucum.UcumServiceEx#validateInProperty(java.lang.String,
+	 * java.lang.String)
+	 */
+	public String validateInProperty(String unit, String property) {
+		assert checkStringParam(unit) : paramError("validate", "unit",
+				"must not be null or empty");
+		assert checkStringParam(property) : paramError("validateInProperty",
+				"property", "must not be null or empty");
+		try {
+			Term term = new ExpressionParser(model).parse(unit);
+			Canonical can = new UcumConverter(model, handlers).convert(term);
+			term = can.getUnit();
+			String cu = new ExpressionComposer().compose(term);
+			if (term.hasComp() && !term.hasOp()
+					&& term.getComp() instanceof Symbol) {
+				Symbol sym = (Symbol) term.getComp();
+				if (sym.getExponent() == 1 && sym.getUnit() instanceof BaseUnit) {
+					BaseUnit b = (BaseUnit) sym.getUnit();
+					if (property.equals(b.getProperty()))
+						return null;
+					else
+						return "unit " + unit + " is of the property type "
+								+ b.getProperty() + " (" + cu + "), not "
+								+ property + " as required.";
+				}
+			}
+			// defined special case
+			if ("concentration".equals(property)
+					&& ("g/L".equals(cu) || "mol/L".equals(cu)))
+				return null;
+
+			return "unit " + unit + " has the base units " + cu
+					+ ", and are not from the property " + property
+					+ " as required.";
+		} catch (UOMoRuntimeException e) {
+			return e.getMessage();
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.ohf.ucum.UcumServiceEx#validateCanonicalUnits(java.lang.String
+	 * , java.lang.String)
+	 */
+	public String validateCanonicalUnits(String unit, String canonical) {
+		assert checkStringParam(unit) : paramError("validate", "unit",
+				"must not be null or empty");
+		assert checkStringParam(canonical) : paramError(
+				"validateCanonicalUnits", "canonical",
+				"must not be null or empty");
+		try {
+			Term term = new ExpressionParser(model).parse(unit);
+			Canonical can = new UcumConverter(model, handlers).convert(term);
+			term = can.getUnit();
+			String cu = new ExpressionComposer().compose(term);
+			if (!canonical.equals(cu))
+				return "unit " + unit + " has the base units " + cu + ", not "
+						+ canonical + " as required.";
+			return null;
+		} catch (UOMoRuntimeException e) {
+			return e.getMessage();
+		}
+	}
+
+	/**
+	 * given a unit, return a formal description of what the units stand for
+	 * using full names
+	 * 
+	 * @param units
+	 *            the unit code
+	 * @return formal description
+	 * @throws UOMoRuntimeException
+	 */
+	public String analyse(String unit) throws UOMoRuntimeException {
+		assert checkStringParam(unit) : paramError("analyse", "unit",
+				"must not be null or empty");
+		Term term = new ExpressionParser(model).parse(unit);
+		return new FormalStructureComposer().compose(term);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.ohf.ucum.UcumServiceEx#getCanonicalUnits(java.lang.String)
+	 */
+	public String getCanonicalUnits(String unit) throws UOMoRuntimeException {
+		assert checkStringParam(unit) : paramError("getCanonicalUnits", "unit",
+				"must not be null or empty");
+		try {
+			Term term = new ExpressionParser(model).parse(unit);
+			term = new UcumConverter(model, handlers).convert(term).getUnit();
+			return new ExpressionComposer().compose(term);
+		} catch (RuntimeException e) {
+			throw new UOMoRuntimeException("Error processing " + unit + ": "
+					+ e.getMessage(), e);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.uomo.ucum.UcumServiceEx#getDefinedForms(java.lang.String)
+	 */
+	public List<DefinedUnit> getDefinedForms(String code)
+			throws UOMoRuntimeException {
+		assert checkStringParam(code) : paramError("getDefinedForms", "code",
+				"must not be null or empty");
+		List<DefinedUnit> result = new ArrayList<DefinedUnit>();
+		BaseUnit base = model.getBaseUnit(code);
+		if (base != null) {
+			for (DefinedUnit unit : model.getDefinedUnits()) {
+				if (!unit.isSpecial()
+						&& code.equals(getCanonicalUnits(unit.getCode())))
+					result.add(unit);
+			}
+		}
+		return result;
+	}
+
+	private boolean checkStringParam(String s) {
+		return s != null && !s.equals("");
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.ohf.ucum.UcumServiceEx#getCanonicalForm(org.eclipse.ohf.ucum
+	 * .UcumEssenceService.Pair)
+	 */
+	public CodeValuePair<Number, String> getCanonicalForm(CodeValuePair<Number, String> value)
+			throws UOMoRuntimeException {
+		assert value != null : paramError("getCanonicalForm", "value",
+				"must not be null");
+		assert checkStringParam(value.getCode()) : paramError(
+				"getCanonicalForm", "value.code", "must not be null or empty");
+
+		Term term = new ExpressionParser(model).parse(value.getCode());
+		Canonical c = new UcumConverter(model, handlers).convert(term);
+		if (value.getValue() == null)
+			return new CodeValuePair<Number, String>(null,
+					new ExpressionComposer().compose(c.getUnit()));
+		else
+			return new CodeValuePair<Number, String>(
+					((BigDecimal) value.getValue()).multiply(c.getValue()),
+					new ExpressionComposer().compose(c.getUnit()));
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.uomo.ucum.UcumServiceEx#convert(java.lang.Number,
+	 * java.lang.String, java.lang.String)
+	 */
+	public Number convert(final Number value, String sourceUnit, String destUnit)
+			throws UOMoRuntimeException {
+		assert value != null : paramError("convert", "value",
+				"must not be null");
+		assert checkStringParam(sourceUnit) : paramError("convert",
+				"sourceUnit", "must not be null or empty");
+		assert checkStringParam(destUnit) : paramError("convert", "destUnit",
+				"must not be null or empty");
+
+		if (sourceUnit.equals(destUnit))
+			return value;
+
+		Canonical src = new UcumConverter(model, handlers)
+				.convert(new ExpressionParser(model).parse(sourceUnit));
+		Canonical dst = new UcumConverter(model, handlers)
+				.convert(new ExpressionParser(model).parse(destUnit));
+		String s = new ExpressionComposer().compose(src.getUnit());
+		String d = new ExpressionComposer().compose(dst.getUnit());
+		if (!s.equals(d))
+			throw new UOMoRuntimeException("Unable to convert between units "
+					+ sourceUnit + " and " + destUnit
+					+ " as they do not have matching canonical forms (" + s
+					+ " and " + d + " respectively)");
+		final BigDecimal decValue = (BigDecimal) value;
+		final BigDecimal canValue = decValue.multiply(src.getValue());
+		final BigDecimal result = canValue.divide(dst.getValue(), new MathContext(25));
+		println(decValue.toPlainString() + sourceUnit + " =("
+				+ src.getValue().toPlainString() + ")= "
+				+ canValue.toPlainString() + s + " =("
+				+ dst.getValue().toPlainString() + ")= "
+				+ result);
+		return result;
+	}
+
+	public CodeValuePair<Number, String> multiply(CodeValuePair<Number, String> o1,
+			CodeValuePair<Number, String> o2) {
+		// Term term = new ExpressionParser(model).parse(o1.getCode());
+		// Canonical c = new Converter(model, handlers).convert(term);
+		return new CodeValuePair<Number, String>(
+				((BigDecimal) o1.getValue()).multiply((BigDecimal) o2
+						.getValue()),
+				// new ExpressionComposer().compose(c.getUnit()));
+				o1.getCode() + "." + o2.getCode());
+	}
+
+}
diff --git a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/internal/Messages.java b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/internal/Messages.java
index 43520d1..e11aaf7 100644
--- a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/internal/Messages.java
+++ b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/internal/Messages.java
@@ -1,29 +1,29 @@
-package org.eclipse.uomo.ucum.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = Messages.class.getPackage().getName() + ".messages"; //$NON-NLS-1$
-	public static String DefinitionParser_0;
-	public static String DefinitionParser_2;
-	public static String DefinitionParser_29;
-	public static String DefinitionParser_3;
-	public static String DefinitionParser_30;
-	public static String DefinitionParser_DateFormat;
-	public static String DefinitionParser_54;
-	public static String DefinitionParser_55;
-	public static String DefinitionParser_56;
-	public static String DefinitionParser_57;
-	public static String DefinitionParser_58;
-	public static String DefinitionParser_59;
-	public static String DefinitionParser_60;
-	public static String DefinitionParser_8;
-	public static String DefinitionParser_9;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
+package org.eclipse.uomo.ucum.internal;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+	private static final String BUNDLE_NAME = Messages.class.getPackage().getName() + ".messages"; //$NON-NLS-1$
+	public static String DefinitionParser_0;
+	public static String DefinitionParser_2;
+	public static String DefinitionParser_29;
+	public static String DefinitionParser_3;
+	public static String DefinitionParser_30;
+	public static String DefinitionParser_DateFormat;
+	public static String DefinitionParser_54;
+	public static String DefinitionParser_55;
+	public static String DefinitionParser_56;
+	public static String DefinitionParser_57;
+	public static String DefinitionParser_58;
+	public static String DefinitionParser_59;
+	public static String DefinitionParser_60;
+	public static String DefinitionParser_8;
+	public static String DefinitionParser_9;
+	static {
+		// initialize resource bundle
+		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+	}
+
+	private Messages() {
+	}
+}
diff --git a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/model/Concept.java b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/model/Concept.java
index d41a9ed..6db24b0 100644
--- a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/model/Concept.java
+++ b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/model/Concept.java
@@ -1,127 +1,127 @@
-/*******************************************************************************
- * Crown Copyright (c) 2006, 2012, Copyright (c) 2006, 2008 Kestral Computing P/L.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *    Kestral Computing P/L - initial implementation
- *    Werner Keil - updates and consolidation with core
- *******************************************************************************/
-
-package org.eclipse.uomo.ucum.model;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.uomo.core.ICode;
-import org.eclipse.uomo.core.IDescription;
-import org.eclipse.uomo.core.INames;
-import org.eclipse.uomo.core.ISymbol;
-
-public class Concept implements ICode<String>, IDescription, ISymbol, INames {
-
-	private final ConceptKind kind;
-	/**
-	 * case sensitive code for this concept
-	 */
-	private String code;
-	
-	/**
-	 * case insensitive (UPPERCASE) code for this concept
-	 */
-	private String codeUC;
-	
-	/**
-	 * print symbol for this code 
-	 */
-	private String printSymbol;
-	
-	/**
-	 * names for the concept
-	 */
-	private List<String> names = new ArrayList<String>();
-	
-	
-	/**
-	 * @param code
-	 * @param codeUC
-	 */
-	public Concept(ConceptKind kind, String code, String codeUC) {
-		super();
-		this.kind = kind;
-		this.code = code;
-		this.codeUC = codeUC;
-	}
-
-	/**
-	 * @return the code
-	 */
-	public String getCode() {
-		return code;
-	}
-
-	/**
-	 * @param code the code to set
-	 */
-	public void setCode(String code) {
-		this.code = code;
-	}
-
-	/**
-	 * @return the codeUC
-	 */
-	public String getCodeUC() {
-		return codeUC;
-	}
-
-	/**
-	 * @param codeUC the codeUC to set
-	 */
-	public void setCodeUC(String codeUC) {
-		this.codeUC = codeUC;
-	}
-
-	/**
-	 * @return the printSymbol
-	 */
-	public String getPrintSymbol() {
-		return printSymbol;
-	}
-
-	/**
-	 * @param printSymbol the printSymbol to set
-	 */
-	public void setPrintSymbol(String printSymbol) {
-		this.printSymbol = printSymbol;
-	}
-	
-	@Override
-	public String getSymbol() {
-		return getPrintSymbol();
-	}
-
-	/**
-	 * @return the names
-	 */
-	public List<String> getNames() {
-		return names;
-	}
-
-	/**
-	 * @return the kind
-	 */
-	public ConceptKind getKind() {
-		return kind;
-	}
-
-	public String getDescription() {
-		return  kind.toString().toLowerCase()+" "+code+" ('"+names.get(0)+"')"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-	
-	@Override
-	public String toString() {
-		return this.getCode() + " = " + getDescription(); //$NON-NLS-1$
-	}
-}
+/*******************************************************************************
+ * Crown Copyright (c) 2006, 2012, Copyright (c) 2006, 2008 Kestral Computing P/L.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *    Kestral Computing P/L - initial implementation
+ *    Werner Keil - updates and consolidation with core
+ *******************************************************************************/
+
+package org.eclipse.uomo.ucum.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.uomo.core.ICode;
+import org.eclipse.uomo.core.IDescription;
+import org.eclipse.uomo.core.INames;
+import org.eclipse.uomo.core.ISymbol;
+
+public class Concept implements ICode<String>, IDescription, ISymbol, INames {
+
+	private final ConceptKind kind;
+	/**
+	 * case sensitive code for this concept
+	 */
+	private String code;
+	
+	/**
+	 * case insensitive (UPPERCASE) code for this concept
+	 */
+	private String codeUC;
+	
+	/**
+	 * print symbol for this code 
+	 */
+	private String printSymbol;
+	
+	/**
+	 * names for the concept
+	 */
+	private List<String> names = new ArrayList<String>();
+	
+	
+	/**
+	 * @param code
+	 * @param codeUC
+	 */
+	public Concept(ConceptKind kind, String code, String codeUC) {
+		super();
+		this.kind = kind;
+		this.code = code;
+		this.codeUC = codeUC;
+	}
+
+	/**
+	 * @return the code
+	 */
+	public String getCode() {
+		return code;
+	}
+
+	/**
+	 * @param code the code to set
+	 */
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	/**
+	 * @return the codeUC
+	 */
+	public String getCodeUC() {
+		return codeUC;
+	}
+
+	/**
+	 * @param codeUC the codeUC to set
+	 */
+	public void setCodeUC(String codeUC) {
+		this.codeUC = codeUC;
+	}
+
+	/**
+	 * @return the printSymbol
+	 */
+	public String getPrintSymbol() {
+		return printSymbol;
+	}
+
+	/**
+	 * @param printSymbol the printSymbol to set
+	 */
+	public void setPrintSymbol(String printSymbol) {
+		this.printSymbol = printSymbol;
+	}
+	
+	@Override
+	public String getSymbol() {
+		return getPrintSymbol();
+	}
+
+	/**
+	 * @return the names
+	 */
+	public List<String> getNames() {
+		return names;
+	}
+
+	/**
+	 * @return the kind
+	 */
+	public ConceptKind getKind() {
+		return kind;
+	}
+
+	public String getDescription() {
+		return  kind.toString().toLowerCase()+" "+code+" ('"+names.get(0)+"')"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+	}
+	
+	@Override
+	public String toString() {
+		return this.getCode() + " = " + getDescription(); //$NON-NLS-1$
+	}
+}
diff --git a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/model/Prefix.java b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/model/Prefix.java
index e6619ff..709ebbb 100644
--- a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/model/Prefix.java
+++ b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/model/Prefix.java
@@ -1,56 +1,56 @@
-/*******************************************************************************
- * Crown Copyright (c) 2006, 2008, Copyright (c) 2006, 2008 Kestral Computing P/L.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *    Kestral Computing P/L - initial implementation
- *******************************************************************************/
-
-package org.eclipse.uomo.ucum.model;
-
-import java.math.BigDecimal;
-
-public class Prefix extends Concept {
-	
-	/**
-	 * value for the prefix.  
-	 */
-	private BigDecimal value; // 1^-24 through to 1^24
-
-	/**
-	 * @param code
-	 * @param codeUC
-	 */
-	public Prefix(String code, String codeUC) {
-		super(ConceptKind.PREFIX, code, codeUC);
-	}
-
-	/**
-	 * @return the index
-	 */
-	public Number getValue() {
-		return value;
-	}
-
-	/**
-	 * @param index the index to set
-	 */
-	public void setValue(BigDecimal index) {
-		this.value = index;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.ucum.model.Concept#getDescription()
-	 */
-	@Override
-	public String getDescription() {
-		return super.getDescription()+" = "+value.toEngineeringString();
-	}
-	
-	
-	
-
-}
+/*******************************************************************************
+ * Crown Copyright (c) 2006, 2008, Copyright (c) 2006, 2008 Kestral Computing P/L.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *    Kestral Computing P/L - initial implementation
+ *******************************************************************************/
+
+package org.eclipse.uomo.ucum.model;
+
+import java.math.BigDecimal;
+
+public class Prefix extends Concept {
+	
+	/**
+	 * value for the prefix.  
+	 */
+	private BigDecimal value; // 1^-24 through to 1^24
+
+	/**
+	 * @param code
+	 * @param codeUC
+	 */
+	public Prefix(String code, String codeUC) {
+		super(ConceptKind.PREFIX, code, codeUC);
+	}
+
+	/**
+	 * @return the index
+	 */
+	public Number getValue() {
+		return value;
+	}
+
+	/**
+	 * @param index the index to set
+	 */
+	public void setValue(BigDecimal index) {
+		this.value = index;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.ucum.model.Concept#getDescription()
+	 */
+	@Override
+	public String getDescription() {
+		return super.getDescription()+" = "+value.toEngineeringString();
+	}
+	
+	
+	
+
+}
diff --git a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/model/Value.java b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/model/Value.java
index c7f492d..e79bd42 100644
--- a/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/model/Value.java
+++ b/bundles/org.eclipse.uomo.ucum/src/main/java/org/eclipse/uomo/ucum/model/Value.java
@@ -1,110 +1,110 @@
-/*******************************************************************************
- * Crown Copyright (c) 2006, 2011, Copyright (c) 2006, 2008 Kestral Computing P/L.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *    Kestral Computing P/L - initial implementation
- *    Werner Keil - Cleaning, unification with other UOMo parts and Unit-API
- *******************************************************************************/
-
-package org.eclipse.uomo.ucum.model;
-
-import java.math.BigDecimal;
-
-import org.eclipse.uomo.core.IDescription;
-import org.eclipse.uomo.core.IText;
-import org.unitsofmeasurement.quantity.Quantity;
-import org.unitsofmeasurement.unit.Unit;
-
-public class Value<Q extends Quantity<Q>> implements Quantity<Q>, IDescription, IText {
-	// TODO should use Quantity
-	// TODO make this a "real" unit, should be at least UcumUnit
-	private String unit;
-	private Unit<Q> realUnit;
-	private String unitUC;
-	
-	private BigDecimal value;
-	
-	private String text;
-
-	/**
-	 * @param unit
-	 * @param unitUC
-	 * @param value
-	 */
-	public Value(String unit, String unitUC, BigDecimal value) {
-		super();
-		this.unit = unit;
-		this.unitUC = unitUC;
-		this.value = value;
-	}
-
-	/**
-	 * @return the unit
-	 */
-	public String getUnit() {
-		return unit;
-	}
-
-	/**
-	 * @param unit the unit to set
-	 */
-	public void setUnit(String unit) {
-		this.unit = unit;
-	}
-
-	/**
-	 * @return the unitUC
-	 * @deprecated currently not used
-	 */
-	public String getUnitUC() {
-		return unitUC;
-	}
-
-	/**
-	 * @param unitUC the unitUC to set
-	 * @deprecated currently not used
-	 */
-	public void setUnitUC(String unitUC) {
-		this.unitUC = unitUC;
-	}
-
-	/**
-	 * @param value the value to set
-	 * @deprecated
-	 */
-	void setValue(BigDecimal value) {
-		this.value = value;
-	}
-
-	/**
-	 * @return the text
-	 */
-	public String getText() {
-		return text;
-	}
-
-	/**
-	 * @param text the text to set
-	 */
-	public void setText(String text) {
-		this.text = text;
-	}
-
-	public String getDescription() {
-		if (value == null)
-			return unit;
-		return value.toEngineeringString()+unit;
-	}
-
-	public Number value() {
-		return value;
-	}
-
-	public Unit<Q> unit() {
-		return realUnit;
-	}		
-}
+/*******************************************************************************
+ * Crown Copyright (c) 2006, 2011, Copyright (c) 2006, 2008 Kestral Computing P/L.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *    Kestral Computing P/L - initial implementation
+ *    Werner Keil - Cleaning, unification with other UOMo parts and Unit-API
+ *******************************************************************************/
+
+package org.eclipse.uomo.ucum.model;
+
+import java.math.BigDecimal;
+
+import org.eclipse.uomo.core.IDescription;
+import org.eclipse.uomo.core.IText;
+import org.unitsofmeasurement.quantity.Quantity;
+import org.unitsofmeasurement.unit.Unit;
+
+public class Value<Q extends Quantity<Q>> implements Quantity<Q>, IDescription, IText {
+	// TODO should use Quantity
+	// TODO make this a "real" unit, should be at least UcumUnit
+	private String unit;
+	private Unit<Q> realUnit;
+	private String unitUC;
+	
+	private BigDecimal value;
+	
+	private String text;
+
+	/**
+	 * @param unit
+	 * @param unitUC
+	 * @param value
+	 */
+	public Value(String unit, String unitUC, BigDecimal value) {
+		super();
+		this.unit = unit;
+		this.unitUC = unitUC;
+		this.value = value;
+	}
+
+	/**
+	 * @return the unit
+	 */
+	public String getUnit() {
+		return unit;
+	}
+
+	/**
+	 * @param unit the unit to set
+	 */
+	public void setUnit(String unit) {
+		this.unit = unit;
+	}
+
+	/**
+	 * @return the unitUC
+	 * @deprecated currently not used
+	 */
+	public String getUnitUC() {
+		return unitUC;
+	}
+
+	/**
+	 * @param unitUC the unitUC to set
+	 * @deprecated currently not used
+	 */
+	public void setUnitUC(String unitUC) {
+		this.unitUC = unitUC;
+	}
+
+	/**
+	 * @param value the value to set
+	 * @deprecated
+	 */
+	void setValue(BigDecimal value) {
+		this.value = value;
+	}
+
+	/**
+	 * @return the text
+	 */
+	public String getText() {
+		return text;
+	}
+
+	/**
+	 * @param text the text to set
+	 */
+	public void setText(String text) {
+		this.text = text;
+	}
+
+	public String getDescription() {
+		if (value == null)
+			return unit;
+		return value.toEngineeringString()+unit;
+	}
+
+	public Number value() {
+		return value;
+	}
+
+	public Unit<Q> unit() {
+		return realUnit;
+	}		
+}
diff --git a/bundles/org.eclipse.uomo.ucum/src/main/resources/org/eclipse/uomo/ucum/internal/messages.properties b/bundles/org.eclipse.uomo.ucum/src/main/resources/org/eclipse/uomo/ucum/internal/messages.properties
index 2886089..a319bea 100644
--- a/bundles/org.eclipse.uomo.ucum/src/main/resources/org/eclipse/uomo/ucum/internal/messages.properties
+++ b/bundles/org.eclipse.uomo.ucum/src/main/resources/org/eclipse/uomo/ucum/internal/messages.properties
@@ -1,15 +1,15 @@
-DefinitionParser_0=Unable to process XML document
-DefinitionParser_2=Unable to process XML document: expected 'root' but found '
-DefinitionParser_29=Error reading 
-DefinitionParser_3='
-DefinitionParser_30=: 
-DefinitionParser_DateFormat=yyyy-MM-dd' 'HH:mm:ss' 'Z
-DefinitionParser_54=Unexpected content reading 
-DefinitionParser_55=Unexpected state looking for 
-DefinitionParser_56=: at 
-DefinitionParser_57=\  reading 
-DefinitionParser_58=Unexpected element looking for 
-DefinitionParser_59=: found 
-DefinitionParser_60=\  reading 
-DefinitionParser_8=Unexpected text 
-DefinitionParser_9=unknown element name 
+DefinitionParser_0=Unable to process XML document
+DefinitionParser_2=Unable to process XML document: expected 'root' but found '
+DefinitionParser_29=Error reading 
+DefinitionParser_3='
+DefinitionParser_30=: 
+DefinitionParser_DateFormat=yyyy-MM-dd' 'HH:mm:ss' 'Z
+DefinitionParser_54=Unexpected content reading 
+DefinitionParser_55=Unexpected state looking for 
+DefinitionParser_56=: at 
+DefinitionParser_57=\  reading 
+DefinitionParser_58=Unexpected element looking for 
+DefinitionParser_59=: found 
+DefinitionParser_60=\  reading 
+DefinitionParser_8=Unexpected text 
+DefinitionParser_9=unknown element name 
diff --git a/bundles/org.eclipse.uomo.ucum/ucum.antlr b/bundles/org.eclipse.uomo.ucum/ucum.antlr
index c68dd64..d164e59 100644
--- a/bundles/org.eclipse.uomo.ucum/ucum.antlr
+++ b/bundles/org.eclipse.uomo.ucum/ucum.antlr
@@ -1,23 +1,23 @@
-ucumExpr   :  DIVIDE expr
-           |  expr 
-           ;
-multiply   :  TIMES term
-           |  DIVIDE term
-           ;
-expr       :  term (multiply)*  
-           ;
-term       :  element (exponent)? (ANN)*
-           ;
-element    :  simpleUnit
-           |  LPAREN expr RPAREN
-           |  ANN
-           ;
-exponent   :  (SIGN)? DIGITS	// allow zero exponent?
-           ;
-simpleUnit :  prefix metricAtom // prefix is token from lexer
-           |  metricAtom  
-           |  nonMetricAtom	// token from lexer
-           |  DIGITS	// allow zero?
-           ;
-metricAtom :  baseUnit // token from lexer
+ucumExpr   :  DIVIDE expr
+           |  expr 
+           ;
+multiply   :  TIMES term
+           |  DIVIDE term
+           ;
+expr       :  term (multiply)*  
+           ;
+term       :  element (exponent)? (ANN)*
+           ;
+element    :  simpleUnit
+           |  LPAREN expr RPAREN
+           |  ANN
+           ;
+exponent   :  (SIGN)? DIGITS	// allow zero exponent?
+           ;
+simpleUnit :  prefix metricAtom // prefix is token from lexer
+           |  metricAtom  
+           |  nonMetricAtom	// token from lexer
+           |  DIGITS	// allow zero?
+           ;
+metricAtom :  baseUnit // token from lexer
            |  derivedMetricAtom // token from lexer
\ No newline at end of file
diff --git a/bundles/org.eclipse.uomo.ui/.classpath b/bundles/org.eclipse.uomo.ui/.classpath
index 5925878..92b64c7 100644
--- a/bundles/org.eclipse.uomo.ui/.classpath
+++ b/bundles/org.eclipse.uomo.ui/.classpath
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src/main/resources/"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/main/resources/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/bundles/org.eclipse.uomo.ui/.gitignore b/bundles/org.eclipse.uomo.ui/.gitignore
index ea8c4bf..0b42d2d 100644
--- a/bundles/org.eclipse.uomo.ui/.gitignore
+++ b/bundles/org.eclipse.uomo.ui/.gitignore
@@ -1 +1 @@
-/target
+/target
diff --git a/bundles/org.eclipse.uomo.ui/.project b/bundles/org.eclipse.uomo.ui/.project
index 1d754de..705268d 100644
--- a/bundles/org.eclipse.uomo.ui/.project
+++ b/bundles/org.eclipse.uomo.ui/.project
@@ -1,34 +1,34 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.uomo.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.uomo.ui</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/bundles/org.eclipse.uomo.ui/.settings/.gitignore b/bundles/org.eclipse.uomo.ui/.settings/.gitignore
index 0924da4..c14d360 100644
--- a/bundles/org.eclipse.uomo.ui/.settings/.gitignore
+++ b/bundles/org.eclipse.uomo.ui/.settings/.gitignore
@@ -1 +1 @@
-/org.eclipse.m2e.core.prefs
+/org.eclipse.m2e.core.prefs
diff --git a/bundles/org.eclipse.uomo.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.uomo.ui/META-INF/MANIFEST.MF
index a8c84da..80adb2f 100644
--- a/bundles/org.eclipse.uomo.ui/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.uomo.ui/META-INF/MANIFEST.MF
@@ -1,8 +1,8 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Eclipse UOMo
-Bundle-SymbolicName: org.eclipse.uomo.ui
-Bundle-Version: 0.7.0.qualifier
-Bundle-Vendor: Eclipse UOMo
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6,
- JavaSE-1.7
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Eclipse UOMo
+Bundle-SymbolicName: org.eclipse.uomo.ui
+Bundle-Version: 0.7.0.qualifier
+Bundle-Vendor: Eclipse UOMo
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6,
+ JavaSE-1.7
diff --git a/bundles/org.eclipse.uomo.ui/about.ini b/bundles/org.eclipse.uomo.ui/about.ini
index 660e6a5..f7812cb 100644
--- a/bundles/org.eclipse.uomo.ui/about.ini
+++ b/bundles/org.eclipse.uomo.ui/about.ini
@@ -1,17 +1,17 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%featureText
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=src/main/resources/uomo32.png
-
-# Property "appName" contains name of the application (translated)
-appName=%featureName
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-welcomePage=$nl$/welcome.xml
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+aboutText=%featureText
+
+# Property "featureImage" contains path to feature image (32x32)
+featureImage=src/main/resources/uomo32.png
+
+# Property "appName" contains name of the application (translated)
+appName=%featureName
+
+# Property "welcomePage" contains path to welcome page (special XML-based format)
+welcomePage=$nl$/welcome.xml
diff --git a/bundles/org.eclipse.uomo.units.tests/.classpath b/bundles/org.eclipse.uomo.units.tests/.classpath
index 0b1bcf9..9bc33d3 100644
--- a/bundles/org.eclipse.uomo.units.tests/.classpath
+++ b/bundles/org.eclipse.uomo.units.tests/.classpath
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src/"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/bundles/org.eclipse.uomo.units.tests/.gitignore b/bundles/org.eclipse.uomo.units.tests/.gitignore
index ea8c4bf..0b42d2d 100644
--- a/bundles/org.eclipse.uomo.units.tests/.gitignore
+++ b/bundles/org.eclipse.uomo.units.tests/.gitignore
@@ -1 +1 @@
-/target
+/target
diff --git a/bundles/org.eclipse.uomo.units.tests/.project b/bundles/org.eclipse.uomo.units.tests/.project
index 335f2a5..5657fb9 100644
--- a/bundles/org.eclipse.uomo.units.tests/.project
+++ b/bundles/org.eclipse.uomo.units.tests/.project
@@ -1,34 +1,34 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.uomo.units.tests</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.uomo.units.tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/bundles/org.eclipse.uomo.units.tests/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.uomo.units.tests/.settings/org.eclipse.jdt.core.prefs
index c537b63..f287d53 100644
--- a/bundles/org.eclipse.uomo.units.tests/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.uomo.units.tests/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/bundles/org.eclipse.uomo.units.tests/.settings/org.eclipse.m2e.core.prefs b/bundles/org.eclipse.uomo.units.tests/.settings/org.eclipse.m2e.core.prefs
index f897a7f..14b697b 100644
--- a/bundles/org.eclipse.uomo.units.tests/.settings/org.eclipse.m2e.core.prefs
+++ b/bundles/org.eclipse.uomo.units.tests/.settings/org.eclipse.m2e.core.prefs
@@ -1,4 +1,4 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/bundles/org.eclipse.uomo.units.tests/META-INF/MANIFEST.MF b/bundles/org.eclipse.uomo.units.tests/META-INF/MANIFEST.MF
index ca6302e..38d452b 100644
--- a/bundles/org.eclipse.uomo.units.tests/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.uomo.units.tests/META-INF/MANIFEST.MF
@@ -1,13 +1,13 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: UoMO Units Tests
-Bundle-SymbolicName: org.eclipse.uomo.units.tests
-Bundle-Version: 0.7.0.qualifier
-Bundle-Vendor: Eclipse org
-Fragment-Host: org.eclipse.uomo.units;bundle-version="0.7.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Export-Package: org.eclipse.uomo.units,
- org.eclipse.uomo.units.impl,
- org.eclipse.uomo.units.impl.format,
- org.eclipse.uomo.units.impl.quantity
-Require-Bundle: org.junit;bundle-version="4.8.2"
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: UoMO Units Tests
+Bundle-SymbolicName: org.eclipse.uomo.units.tests
+Bundle-Version: 0.7.0.qualifier
+Bundle-Vendor: Eclipse org
+Fragment-Host: org.eclipse.uomo.units;bundle-version="0.7.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Export-Package: org.eclipse.uomo.units,
+ org.eclipse.uomo.units.impl,
+ org.eclipse.uomo.units.impl.format,
+ org.eclipse.uomo.units.impl.quantity
+Require-Bundle: org.junit;bundle-version="4.8.2"
diff --git a/bundles/org.eclipse.uomo.units.tests/build.properties b/bundles/org.eclipse.uomo.units.tests/build.properties
index ced5f40..c4e35e4 100644
--- a/bundles/org.eclipse.uomo.units.tests/build.properties
+++ b/bundles/org.eclipse.uomo.units.tests/build.properties
@@ -1,4 +1,4 @@
-source.. = src/
-output.. = target/classes
-bin.includes = META-INF/,\
-               .
+source.. = src/
+output.. = target/classes
+bin.includes = META-INF/,\
+               .
diff --git a/bundles/org.eclipse.uomo.units.tests/src/org/eclipse/uomo/units/impl/Benchmark.java b/bundles/org.eclipse.uomo.units.tests/src/org/eclipse/uomo/units/impl/Benchmark.java
index b26c4b1..ee67cd0 100644
--- a/bundles/org.eclipse.uomo.units.tests/src/org/eclipse/uomo/units/impl/Benchmark.java
+++ b/bundles/org.eclipse.uomo.units.tests/src/org/eclipse/uomo/units/impl/Benchmark.java
@@ -1,105 +1,105 @@
-/**
- * Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Ikayzo and others - initial API and implementation
- */
-package org.eclipse.uomo.units.impl;
-
-import static org.eclipse.uomo.units.SI.GRAM;
-import static org.eclipse.uomo.units.SI.KILOGRAM;
-import static org.eclipse.uomo.units.SI.Prefix.*;
-
-import java.util.Random;
-import java.util.logging.Logger;
-
-import org.eclipse.uomo.units.impl.quantity.MassAmount;
-import org.unitsofmeasurement.quantity.Quantity;
-import org.unitsofmeasurement.unit.IncommensurableException;
-import org.unitsofmeasurement.unit.UnconvertibleException;
-import org.unitsofmeasurement.unit.Unit;
-import org.unitsofmeasurement.unit.UnitConverter;
-
-/**
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version $Revision$, $Date$
- * @param <Q> a quantity
- */
-public class Benchmark<Q extends Quantity<Q>> {
-    // Create logger object (usually with the class name)
-	private static Logger benchmarkLogger = Logger.getLogger(Benchmark.class.getName());
-	
-	private static final int N = 100000;
-
-	// Because of generic array creation.
-	private static final Unit<?>[] UNITS = new Unit[] { MEGA(GRAM), KILOGRAM,
-			GRAM, CENTI(GRAM), MILLI(GRAM), MICRO(GRAM) };
-
-	@SuppressWarnings("unchecked")
-	private static long usingQuantities(final long seed) {
-		long time = System.currentTimeMillis();
-		final Random r = new Random(seed);
-		// final QuantityFactory<Mass> factory =
-		// QuantityFactory.getInstance(Mass.class);
-		final MassAmount[] m = new MassAmount[N];
-		for (int i = 0; i < N; i++) {
-			m[i] = new MassAmount(r.nextGaussian(), KILOGRAM);
-		}
-		// Now perform some computation in a random unit.
-		@SuppressWarnings("rawtypes")
-		final Unit targetUnit = (Unit<?>) UNITS[r.nextInt(UNITS.length)];
-		double sum = 0;
-		for (int i = 0; i < N; i++) {
-			sum += m[i].doubleValue(targetUnit);
-		}
-		time = System.currentTimeMillis() - time;
-		benchmarkLogger.info("Using quantities: ellapsed time=" + (time / 1000f)
-				+ " s., result=" + sum);
-		return time;
-	}
-
-	private static long usingDouble(final long seed)
-			throws UnconvertibleException, IncommensurableException {
-		long time = System.currentTimeMillis();
-		final Random r = new Random(seed);
-		final double[] m = new double[N];
-		for (int i = 0; i < N; i++) {
-			m[i] = r.nextGaussian();
-		}
-		// Now perform some computation in a random unit.
-		final Unit<?> sourceUnit = KILOGRAM;
-		final Unit<?> targetUnit = (Unit<?>) UNITS[r.nextInt(UNITS.length)];
-		UnitConverter cv = sourceUnit.getConverterToAny((Unit<?>) targetUnit);
-		double sum = 0;
-		for (int i = 0; i < N; i++) {
-			sum += cv.convert(m[i]);
-		}
-		time = System.currentTimeMillis() - time;
-		benchmarkLogger.info("Using primitives: ellapsed time=" + (time / 1000f)
-				+ " s., result=" + sum);
-		return time;
-	}
-
-	public static void main(String[] args) throws InterruptedException {
-		// TODO add IE and UE to main
-		// Execute the loop many time for letting Hotspot to "warn up".
-		try {
-			final Random r = new Random();
-			for (int i = 0; i < 20; i++) {
-				final long seed = r.nextLong();
-				long t1 = usingQuantities(seed);
-				long t2 = usingDouble(seed);
-				benchmarkLogger.fine("Ratio: " + (float) t1 / (float) t2);
-				Thread.sleep(100);
-			}
-		} catch (IncommensurableException ie) {
-			throw new InterruptedException();
-		} catch (UnconvertibleException ue) {
-			throw new InterruptedException();
-		}
-	}
-}
+/**
+ * Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Ikayzo and others - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl;
+
+import static org.eclipse.uomo.units.SI.GRAM;
+import static org.eclipse.uomo.units.SI.KILOGRAM;
+import static org.eclipse.uomo.units.SI.Prefix.*;
+
+import java.util.Random;
+import java.util.logging.Logger;
+
+import org.eclipse.uomo.units.impl.quantity.MassAmount;
+import org.unitsofmeasurement.quantity.Quantity;
+import org.unitsofmeasurement.unit.IncommensurableException;
+import org.unitsofmeasurement.unit.UnconvertibleException;
+import org.unitsofmeasurement.unit.Unit;
+import org.unitsofmeasurement.unit.UnitConverter;
+
+/**
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version $Revision$, $Date$
+ * @param <Q> a quantity
+ */
+public class Benchmark<Q extends Quantity<Q>> {
+    // Create logger object (usually with the class name)
+	private static Logger benchmarkLogger = Logger.getLogger(Benchmark.class.getName());
+	
+	private static final int N = 100000;
+
+	// Because of generic array creation.
+	private static final Unit<?>[] UNITS = new Unit[] { MEGA(GRAM), KILOGRAM,
+			GRAM, CENTI(GRAM), MILLI(GRAM), MICRO(GRAM) };
+
+	@SuppressWarnings("unchecked")
+	private static long usingQuantities(final long seed) {
+		long time = System.currentTimeMillis();
+		final Random r = new Random(seed);
+		// final QuantityFactory<Mass> factory =
+		// QuantityFactory.getInstance(Mass.class);
+		final MassAmount[] m = new MassAmount[N];
+		for (int i = 0; i < N; i++) {
+			m[i] = new MassAmount(r.nextGaussian(), KILOGRAM);
+		}
+		// Now perform some computation in a random unit.
+		@SuppressWarnings("rawtypes")
+		final Unit targetUnit = (Unit<?>) UNITS[r.nextInt(UNITS.length)];
+		double sum = 0;
+		for (int i = 0; i < N; i++) {
+			sum += m[i].doubleValue(targetUnit);
+		}
+		time = System.currentTimeMillis() - time;
+		benchmarkLogger.info("Using quantities: ellapsed time=" + (time / 1000f)
+				+ " s., result=" + sum);
+		return time;
+	}
+
+	private static long usingDouble(final long seed)
+			throws UnconvertibleException, IncommensurableException {
+		long time = System.currentTimeMillis();
+		final Random r = new Random(seed);
+		final double[] m = new double[N];
+		for (int i = 0; i < N; i++) {
+			m[i] = r.nextGaussian();
+		}
+		// Now perform some computation in a random unit.
+		final Unit<?> sourceUnit = KILOGRAM;
+		final Unit<?> targetUnit = (Unit<?>) UNITS[r.nextInt(UNITS.length)];
+		UnitConverter cv = sourceUnit.getConverterToAny((Unit<?>) targetUnit);
+		double sum = 0;
+		for (int i = 0; i < N; i++) {
+			sum += cv.convert(m[i]);
+		}
+		time = System.currentTimeMillis() - time;
+		benchmarkLogger.info("Using primitives: ellapsed time=" + (time / 1000f)
+				+ " s., result=" + sum);
+		return time;
+	}
+
+	public static void main(String[] args) throws InterruptedException {
+		// TODO add IE and UE to main
+		// Execute the loop many time for letting Hotspot to "warn up".
+		try {
+			final Random r = new Random();
+			for (int i = 0; i < 20; i++) {
+				final long seed = r.nextLong();
+				long t1 = usingQuantities(seed);
+				long t2 = usingDouble(seed);
+				benchmarkLogger.fine("Ratio: " + (float) t1 / (float) t2);
+				Thread.sleep(100);
+			}
+		} catch (IncommensurableException ie) {
+			throw new InterruptedException();
+		} catch (UnconvertibleException ue) {
+			throw new InterruptedException();
+		}
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/.classpath b/bundles/org.eclipse.uomo.units/.classpath
index 710ceaa..7e0a6d5 100644
--- a/bundles/org.eclipse.uomo.units/.classpath
+++ b/bundles/org.eclipse.uomo.units/.classpath
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry exported="true" kind="lib" path="libs/unit-api-0.6.1.jar"/>
-	<classpathentry kind="src" path="src/main/java/"/>
-	<classpathentry kind="src" path="src/main/resources/"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry exported="true" kind="lib" path="libs/unit-api-0.6.1.jar"/>
+	<classpathentry kind="src" path="src/main/java/"/>
+	<classpathentry kind="src" path="src/main/resources/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/bundles/org.eclipse.uomo.units/.gitignore b/bundles/org.eclipse.uomo.units/.gitignore
index 2c36b17..21d5518 100644
--- a/bundles/org.eclipse.uomo.units/.gitignore
+++ b/bundles/org.eclipse.uomo.units/.gitignore
@@ -1,2 +1,2 @@
-/target
-/.settings
+/target
+/.settings
diff --git a/bundles/org.eclipse.uomo.units/.project b/bundles/org.eclipse.uomo.units/.project
index 1d6f88c..76fec93 100644
--- a/bundles/org.eclipse.uomo.units/.project
+++ b/bundles/org.eclipse.uomo.units/.project
@@ -1,60 +1,60 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.uomo.units</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.wst.common.project.facet.core.builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.jboss.tools.jst.web.kb.kbbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.jboss.tools.cdi.core.cdibuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.wst.validation.validationbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
-		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
-		<nature>com.springsource.server.ide.facet.core.bundlenature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
-		<nature>org.jboss.tools.jst.web.kb.kbnature</nature>
-		<nature>org.jboss.tools.cdi.core.cdinature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.uomo.units</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.jboss.tools.jst.web.kb.kbbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.jboss.tools.cdi.core.cdibuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.validation.validationbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+		<nature>com.springsource.server.ide.facet.core.bundlenature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+		<nature>org.jboss.tools.jst.web.kb.kbnature</nature>
+		<nature>org.jboss.tools.cdi.core.cdinature</nature>
+	</natures>
+</projectDescription>
diff --git a/bundles/org.eclipse.uomo.units/META-INF/MANIFEST.MF b/bundles/org.eclipse.uomo.units/META-INF/MANIFEST.MF
index 9c0c9a9..5e437e3 100644
--- a/bundles/org.eclipse.uomo.units/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.uomo.units/META-INF/MANIFEST.MF
@@ -1,26 +1,26 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: UOMo Units of Measurement
-Bundle-SymbolicName: org.eclipse.uomo.units;singleton:=true
-Bundle-Version: 0.7.0.qualifier
-Bundle-Activator: org.eclipse.uomo.units.Activator
-Bundle-Vendor: Eclipse.org
-Require-Bundle: com.ibm.icu;bundle-version="50.1.0";visibility:=reexport,
- org.eclipse.uomo.core;bundle-version="0.1.0"
-Import-Package: org.osgi.framework;version="1.3.0",
- org.osgi.util.tracker;version="1.3.1",
- org.unitsofmeasurement.unit
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.uomo.units,
- org.eclipse.uomo.units.impl;uses:="org.unitsofmeasurement.unit,org.eclipse.uomo.units",
- org.eclipse.uomo.units.impl.converter;uses:="org.unitsofmeasurement.unit,org.eclipse.uomo.units",
- org.eclipse.uomo.units.impl.format,
- org.eclipse.uomo.units.impl.quantity;
-  uses:="org.eclipse.uomo.units.impl,
-   org.unitsofmeasurement.quantity,
-   org.unitsofmeasurement.unit,
-   org.eclipse.uomo.units",
- org.eclipse.uomo.units.impl.system;uses:="org.unitsofmeasurement.unit,org.eclipse.uomo.units,org.unitsofmeasurement.service"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Bundle-ClassPath: libs/unit-api-0.6.1.jar,
- .
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: UOMo Units of Measurement
+Bundle-SymbolicName: org.eclipse.uomo.units;singleton:=true
+Bundle-Version: 0.7.0.qualifier
+Bundle-Activator: org.eclipse.uomo.units.Activator
+Bundle-Vendor: Eclipse.org
+Require-Bundle: com.ibm.icu;bundle-version="50.1.0";visibility:=reexport,
+ org.eclipse.uomo.core;bundle-version="0.1.0"
+Import-Package: org.osgi.framework;version="1.3.0",
+ org.osgi.util.tracker;version="1.3.1",
+ org.unitsofmeasurement.unit
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.uomo.units,
+ org.eclipse.uomo.units.impl;uses:="org.unitsofmeasurement.unit,org.eclipse.uomo.units",
+ org.eclipse.uomo.units.impl.converter;uses:="org.unitsofmeasurement.unit,org.eclipse.uomo.units",
+ org.eclipse.uomo.units.impl.format,
+ org.eclipse.uomo.units.impl.quantity;
+  uses:="org.eclipse.uomo.units.impl,
+   org.unitsofmeasurement.quantity,
+   org.unitsofmeasurement.unit,
+   org.eclipse.uomo.units",
+ org.eclipse.uomo.units.impl.system;uses:="org.unitsofmeasurement.unit,org.eclipse.uomo.units,org.unitsofmeasurement.service"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ClassPath: libs/unit-api-0.6.1.jar,
+ .
diff --git a/bundles/org.eclipse.uomo.units/libs/README b/bundles/org.eclipse.uomo.units/libs/README
index 9edcad5..3b4d98f 100644
--- a/bundles/org.eclipse.uomo.units/libs/README
+++ b/bundles/org.eclipse.uomo.units/libs/README
@@ -1,3 +1,3 @@
-This jar file is included here because it cannot be downloaded from a public p2 repository at this time.
-
+This jar file is included here because it cannot be downloaded from a public p2 repository at this time.
+
 If this file is included in Orbit - it can be removed.
\ No newline at end of file
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/.gitignore b/bundles/org.eclipse.uomo.units/src/main/java/.gitignore
index 1a70481..f023427 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/.gitignore
+++ b/bundles/org.eclipse.uomo.units/src/main/java/.gitignore
@@ -1 +1 @@
-/META-INF
+/META-INF
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/AbstractConverter.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/AbstractConverter.java
index 5d7a880..31dc596 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/AbstractConverter.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/AbstractConverter.java
@@ -1,276 +1,276 @@
-/**
- * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Ikayzo and others - initial API and implementation
- */
-package org.eclipse.uomo.units;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.math.MathContext;
-import java.util.Arrays;
-import java.util.List;
-
-import org.unitsofmeasurement.unit.UnitConverter;
-
-/**
- * <p> This class represents a converter of numeric values.</p>
- *
- * <p> It is not required for sub-classes to be immutable
- *     (e.g. currency converter).</p>
- *
- * <p> Sub-classes must ensure unicity of the {@linkplain #IDENTITY identity}
- *     converter. In other words, if the result of an operation is equivalent
- *     to the identity converter, then the unique {@link #IDENTITY} instance
- *     should be returned.</p>
- *
- * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.4 ($Revision: 231 $), $Date: 2010-10-13 16:53:37 +0200 (Mi, 13 Okt 2010) $
- */
-public abstract class AbstractConverter implements UnitConverter, Serializable {
-
-    /**
-     * For cross-version compatibility.
-     */
-    private static final long serialVersionUID = 2557410026012911803L;
-
-    /**
-     * Holds the identity converter (unique). This converter does nothing
-     * (<code>ONE.convert(x) == x</code>). This instance is unique.
-     */
-    public static final UnitConverter IDENTITY = new Identity();
-
-    /**
-     * Default constructor.
-     */
-    protected AbstractConverter() {
-    }
-
-    /**
-     * Returns the inverse of this converter. If <code>x</code> is a valid
-     * value, then <code>x == inverse().convert(convert(x))</code> to within
-     * the accuracy of computer arithmetic.
-     *
-     * @return the inverse of this converter.
-     */
-    public abstract UnitConverter inverse();
-
-    /**
-     * Indicates whether this converter is considered to be the the same as the
-     * one specified.
-     *
-     * @param  cvtr the converter with which to compare.
-     * @return <code>true</code> if the specified object is a converter
-     *         considered equals to this converter;<code>false</code> otherwise.
-     */
-//    @Override
-//    public abstract boolean equals(Object cvtr);
-
-    /**
-     * Returns a hash code value for this converter. Equals object have equal
-     * hash codes.
-     *
-     * @return this converter hash code value.
-     * @see    #equals
-     */
-    //@Override
-    //public abstract int hashCode();
-
-    /**
-     * Concatenates this converter with another converter. The resulting
-     * converter is equivalent to first converting by the specified converter
-     * (right converter), and then converting by this converter (left converter).
-     *
-     * <p>Note: Implementations must ensure that the {@link #IDENTITY} instance
-     *          is returned if the resulting converter is an identity
-     *          converter.</p>
-     *
-     * @param  converter the other converter.
-     * @return the concatenation of this converter with the other converter.
-     */
-    public UnitConverter concatenate(UnitConverter converter) {
-        return (converter == IDENTITY) ? this : new CompoundImpl(this, converter);
-    }
-	
-    @Override
-	public boolean isIdentity() {
-		return false;
-	}
-
-	@Override
-	public List<UnitConverter> getCompoundConverters() {
-		return Arrays.asList((UnitConverter)new CompoundImpl(this, this));
-	}
-	
-    /**
-     * This interface is implemented by converters made up of two
-     * separate converters (in matrix notation
-     * <code>[compound] = [left] x [right]</code>).
-     */
-    public interface Compound {
-
-        /**
-         * Returns the left converter of this compound converter
-         * (the last one performing the conversion).
-         *
-         * @return the left converter.
-         */
-        AbstractConverter getLeft();
-
-        /**
-         * Returns the right converter of this compound converter
-         * (the first one performing the conversion).
-         *
-         * @return the right converter.
-         */
-        AbstractConverter getRight();
-    }
-
-    /**
-     * This inner class represents the identity converter (singleton).
-     */
-    private static final class Identity extends AbstractConverter {
-
-        /**
-         * For cross-version compatibility.
-         */
-        private static final long serialVersionUID = 7675901502919547460L;
-
-        @Override
-        public Identity inverse() {
-            return this;
-        }
-
-        @Override
-        public double convert(double value) {
-            return value;
-        }
-
-        @Override
-        public BigDecimal convert(BigDecimal value, MathContext ctx) {
-            return value;
-        }
-
-		public Number convert(Number value) {
-			return value;
-		}
-		
-        @Override
-        public boolean equals(Object cvtr) {
-            return this == cvtr; // Unique instance.
-        }
-
-        @Override
-        public int hashCode() {
-            return 0;
-        }
-
-        @Override
-        public boolean isLinear() {
-            return true;
-        }
-
-		@Override
-		public boolean isIdentity() {
-			return true;
-		}
-    }
-
-    /**
-     * This inner class represents a compound converter (non-linear).
-     */
-    private static final class CompoundImpl extends AbstractConverter implements Compound {
-
-        /**
-         * For cross-version compatibility.
-         */
-        private static final long serialVersionUID = 2242882007946934958L;
-
-        /**
-         * Holds the first converter.
-         */
-        private final AbstractConverter left;
-
-        /**
-         * Holds the second converter.
-         */
-        private final AbstractConverter right;
-
-        /**
-         * Creates a compound converter resulting from the combined
-         * transformation of the specified converters.
-         *
-         * @param  unitConverter the left converter.
-         * @param  unitConverter2 the right converter.
-         */
-        private CompoundImpl(UnitConverter unitConverter, UnitConverter unitConverter2) {
-            this.left = (AbstractConverter) unitConverter;
-            this.right = (AbstractConverter) unitConverter2;
-        }
-
-        @Override
-        public UnitConverter inverse() {
-            return new CompoundImpl(right.inverse(), left.inverse());
-        }
-
-        @Override
-        public double convert(double value) {
-            return left.convert(right.convert(value));
-        }
-
-        @Override
-        public BigDecimal convert(BigDecimal value, MathContext ctx) {
-            return left.convert(right.convert(value, ctx), ctx);
-        }
-
-
-		public Number convert(Number value) {
-			return left.convert(right.convert(value));
-		}
-        
-        @Override
-        public boolean equals(Object cvtr) {
-            if (this == cvtr)
-                return true;
-            if (!(cvtr instanceof Compound))
-                return false;
-            Compound that = (Compound) cvtr;
-            return (this.left.equals(that.getLeft()))
-                    && (this.right.equals(that.getRight()));
-        }
-
-        @Override
-        public int hashCode() {
-            return left.hashCode() + right.hashCode();
-        }
-
-        @Override
-        public boolean isLinear() {
-            return left.isLinear() && right.isLinear();
-        }
-
-        public AbstractConverter getLeft() {
-            return left;
-        }
-
-        public AbstractConverter getRight() {
-            return right;
-        }
-
-		@Override
-		public UnitConverter concatenate(UnitConverter converter) {
-			return (converter == IDENTITY) ? this : new CompoundImpl(this, converter);
-		}
-
-		@Override
-		public List<UnitConverter> getCompoundConverters() {
-			return Arrays.asList((UnitConverter)new CompoundImpl(this, this));
-		}
-    }
-}
+/**
+ * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Ikayzo and others - initial API and implementation
+ */
+package org.eclipse.uomo.units;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.util.Arrays;
+import java.util.List;
+
+import org.unitsofmeasurement.unit.UnitConverter;
+
+/**
+ * <p> This class represents a converter of numeric values.</p>
+ *
+ * <p> It is not required for sub-classes to be immutable
+ *     (e.g. currency converter).</p>
+ *
+ * <p> Sub-classes must ensure unicity of the {@linkplain #IDENTITY identity}
+ *     converter. In other words, if the result of an operation is equivalent
+ *     to the identity converter, then the unique {@link #IDENTITY} instance
+ *     should be returned.</p>
+ *
+ * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.4 ($Revision: 231 $), $Date: 2010-10-13 16:53:37 +0200 (Mi, 13 Okt 2010) $
+ */
+public abstract class AbstractConverter implements UnitConverter, Serializable {
+
+    /**
+     * For cross-version compatibility.
+     */
+    private static final long serialVersionUID = 2557410026012911803L;
+
+    /**
+     * Holds the identity converter (unique). This converter does nothing
+     * (<code>ONE.convert(x) == x</code>). This instance is unique.
+     */
+    public static final UnitConverter IDENTITY = new Identity();
+
+    /**
+     * Default constructor.
+     */
+    protected AbstractConverter() {
+    }
+
+    /**
+     * Returns the inverse of this converter. If <code>x</code> is a valid
+     * value, then <code>x == inverse().convert(convert(x))</code> to within
+     * the accuracy of computer arithmetic.
+     *
+     * @return the inverse of this converter.
+     */
+    public abstract UnitConverter inverse();
+
+    /**
+     * Indicates whether this converter is considered to be the the same as the
+     * one specified.
+     *
+     * @param  cvtr the converter with which to compare.
+     * @return <code>true</code> if the specified object is a converter
+     *         considered equals to this converter;<code>false</code> otherwise.
+     */
+//    @Override
+//    public abstract boolean equals(Object cvtr);
+
+    /**
+     * Returns a hash code value for this converter. Equals object have equal
+     * hash codes.
+     *
+     * @return this converter hash code value.
+     * @see    #equals
+     */
+    //@Override
+    //public abstract int hashCode();
+
+    /**
+     * Concatenates this converter with another converter. The resulting
+     * converter is equivalent to first converting by the specified converter
+     * (right converter), and then converting by this converter (left converter).
+     *
+     * <p>Note: Implementations must ensure that the {@link #IDENTITY} instance
+     *          is returned if the resulting converter is an identity
+     *          converter.</p>
+     *
+     * @param  converter the other converter.
+     * @return the concatenation of this converter with the other converter.
+     */
+    public UnitConverter concatenate(UnitConverter converter) {
+        return (converter == IDENTITY) ? this : new CompoundImpl(this, converter);
+    }
+	
+    @Override
+	public boolean isIdentity() {
+		return false;
+	}
+
+	@Override
+	public List<UnitConverter> getCompoundConverters() {
+		return Arrays.asList((UnitConverter)new CompoundImpl(this, this));
+	}
+	
+    /**
+     * This interface is implemented by converters made up of two
+     * separate converters (in matrix notation
+     * <code>[compound] = [left] x [right]</code>).
+     */
+    public interface Compound {
+
+        /**
+         * Returns the left converter of this compound converter
+         * (the last one performing the conversion).
+         *
+         * @return the left converter.
+         */
+        AbstractConverter getLeft();
+
+        /**
+         * Returns the right converter of this compound converter
+         * (the first one performing the conversion).
+         *
+         * @return the right converter.
+         */
+        AbstractConverter getRight();
+    }
+
+    /**
+     * This inner class represents the identity converter (singleton).
+     */
+    private static final class Identity extends AbstractConverter {
+
+        /**
+         * For cross-version compatibility.
+         */
+        private static final long serialVersionUID = 7675901502919547460L;
+
+        @Override
+        public Identity inverse() {
+            return this;
+        }
+
+        @Override
+        public double convert(double value) {
+            return value;
+        }
+
+        @Override
+        public BigDecimal convert(BigDecimal value, MathContext ctx) {
+            return value;
+        }
+
+		public Number convert(Number value) {
+			return value;
+		}
+		
+        @Override
+        public boolean equals(Object cvtr) {
+            return this == cvtr; // Unique instance.
+        }
+
+        @Override
+        public int hashCode() {
+            return 0;
+        }
+
+        @Override
+        public boolean isLinear() {
+            return true;
+        }
+
+		@Override
+		public boolean isIdentity() {
+			return true;
+		}
+    }
+
+    /**
+     * This inner class represents a compound converter (non-linear).
+     */
+    private static final class CompoundImpl extends AbstractConverter implements Compound {
+
+        /**
+         * For cross-version compatibility.
+         */
+        private static final long serialVersionUID = 2242882007946934958L;
+
+        /**
+         * Holds the first converter.
+         */
+        private final AbstractConverter left;
+
+        /**
+         * Holds the second converter.
+         */
+        private final AbstractConverter right;
+
+        /**
+         * Creates a compound converter resulting from the combined
+         * transformation of the specified converters.
+         *
+         * @param  unitConverter the left converter.
+         * @param  unitConverter2 the right converter.
+         */
+        private CompoundImpl(UnitConverter unitConverter, UnitConverter unitConverter2) {
+            this.left = (AbstractConverter) unitConverter;
+            this.right = (AbstractConverter) unitConverter2;
+        }
+
+        @Override
+        public UnitConverter inverse() {
+            return new CompoundImpl(right.inverse(), left.inverse());
+        }
+
+        @Override
+        public double convert(double value) {
+            return left.convert(right.convert(value));
+        }
+
+        @Override
+        public BigDecimal convert(BigDecimal value, MathContext ctx) {
+            return left.convert(right.convert(value, ctx), ctx);
+        }
+
+
+		public Number convert(Number value) {
+			return left.convert(right.convert(value));
+		}
+        
+        @Override
+        public boolean equals(Object cvtr) {
+            if (this == cvtr)
+                return true;
+            if (!(cvtr instanceof Compound))
+                return false;
+            Compound that = (Compound) cvtr;
+            return (this.left.equals(that.getLeft()))
+                    && (this.right.equals(that.getRight()));
+        }
+
+        @Override
+        public int hashCode() {
+            return left.hashCode() + right.hashCode();
+        }
+
+        @Override
+        public boolean isLinear() {
+            return left.isLinear() && right.isLinear();
+        }
+
+        public AbstractConverter getLeft() {
+            return left;
+        }
+
+        public AbstractConverter getRight() {
+            return right;
+        }
+
+		@Override
+		public UnitConverter concatenate(UnitConverter converter) {
+			return (converter == IDENTITY) ? this : new CompoundImpl(this, converter);
+		}
+
+		@Override
+		public List<UnitConverter> getCompoundConverters() {
+			return Arrays.asList((UnitConverter)new CompoundImpl(this, this));
+		}
+    }
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/AbstractFormat.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/AbstractFormat.java
index f4613b2..61c9eb9 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/AbstractFormat.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/AbstractFormat.java
@@ -1,117 +1,117 @@
-/**
- * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Ikayzo and others - initial API and implementation
- */
-package org.eclipse.uomo.units;
-
-import java.io.IOException;
-import java.text.ParsePosition;
-
-import org.eclipse.uomo.units.impl.format.LocalUnitFormatImpl;
-import org.eclipse.uomo.units.impl.system.USCustomary;
-import org.unitsofmeasurement.unit.Unit;
-import org.unitsofmeasurement.unit.UnitFormat;
-
-import com.ibm.icu.text.UFormat;
-import com.ibm.icu.util.ULocale;
-
-
-/**
- * <p> This class provides the interface for formatting and parsing {@link
- *     AbstractUnit units}.</p>
- *
- * <p> For all metric units, the 20 SI prefixes used to form decimal
- *     multiples and sub-multiples of SI units are recognized.
- *     {@link USCustomary US Customary} units are directly recognized. For example:[code]
- *        Unit.valueOf("m°C").equals(SI.MILLI(SI.CELSIUS))
- *        Unit.valueOf("kW").equals(SI.KILO(SI.WATT))
- *        Unit.valueOf("ft").equals(SI.METRE.multiply(3048).divide(10000))[/code]</p>
- *
- * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.5.1 ($Revision: 215 $), $Date: 2010-09-19 22:12:08 +0200 (So, 19 Sep 2010) $
- * 
- */
-public abstract class AbstractFormat extends UFormat implements UnitFormat {
-
-   /**
-     * Returns the {@link SymbolMap} for this unit format.
-     *
-     * @return the symbol map used by this format.
-     */
-    protected abstract SymbolMap getSymbolMap();
-
-    /**
-     * Formats the specified unit.
-     *
-     * @param unit the unit to format.
-     * @param appendable the appendable destination.
-     * @return The appendable destination passed in as {@code appendable},
-     *         with formatted text appended.
-     * @throws IOException if an error occurs.
-     */
-    public abstract Appendable format(Unit<?> unit, Appendable appendable)
-            throws IOException;
-
-    /**
-     * Parses a portion of the specified <code>CharSequence</code> from the
-     * specified position to produce a unit. If there is no unit to parse
-     * {@link AbstractUnit#ONE} is returned.
-     *
-     * @param csq the <code>CharSequence</code> to parse.
-     * @param cursor the cursor holding the current parsing index.
-     * @return the unit parsed from the specified character sub-sequence.
-     * @throws IllegalArgumentException if any problem occurs while parsing the
-     *         specified character sequence (e.g. illegal syntax).
-     */
-    public abstract Unit<?> parse(CharSequence csq, ParsePosition cursor)
-            throws IllegalArgumentException;
-
-    /**
-     * Return a formatter for CurrencyAmount objects in the given
-     * locale.
-     * @param locale desired locale
-     * @return a formatter object
-     * @stable ICU 3.0
-     */
-    public static AbstractFormat getUnitFormat(ULocale locale) {
-        return LocalUnitFormatImpl.getInstance(locale.toLocale());
-    }
-
-    /**
-     * Return a formatter for CurrencyAmount objects in the default
-     * locale.
-     * @return a formatter object
-     * @stable ICU 3.0
-     */
-    public static AbstractFormat getUnitFormat() {
-        return getUnitFormat(ULocale.getDefault());
-    }
-    
-    /**
-     * Convenience method equivalent to {@link #format(AbstractUnit, Appendable)}
-     * except it does not raise an IOException.
-     *
-     * @param unit the unit to format.
-     * @param dest the appendable destination.
-     * @return the specified <code>StringBuilder</code>.
-     */
-    final StringBuilder format(AbstractUnit<?> unit, StringBuilder dest) {
-        try {
-            return (StringBuilder) this.format(unit, (Appendable) dest);
-        } catch (IOException ex) {
-            throw new Error(ex); // Can never happen.
-        }
-    }
-
-    /**
-     * serialVersionUID
-     */
-    private static final long serialVersionUID = -2046025267890654321L;
-}
+/**
+ * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Ikayzo and others - initial API and implementation
+ */
+package org.eclipse.uomo.units;
+
+import java.io.IOException;
+import java.text.ParsePosition;
+
+import org.eclipse.uomo.units.impl.format.LocalUnitFormatImpl;
+import org.eclipse.uomo.units.impl.system.USCustomary;
+import org.unitsofmeasurement.unit.Unit;
+import org.unitsofmeasurement.unit.UnitFormat;
+
+import com.ibm.icu.text.UFormat;
+import com.ibm.icu.util.ULocale;
+
+
+/**
+ * <p> This class provides the interface for formatting and parsing {@link
+ *     AbstractUnit units}.</p>
+ *
+ * <p> For all metric units, the 20 SI prefixes used to form decimal
+ *     multiples and sub-multiples of SI units are recognized.
+ *     {@link USCustomary US Customary} units are directly recognized. For example:[code]
+ *        Unit.valueOf("m°C").equals(SI.MILLI(SI.CELSIUS))
+ *        Unit.valueOf("kW").equals(SI.KILO(SI.WATT))
+ *        Unit.valueOf("ft").equals(SI.METRE.multiply(3048).divide(10000))[/code]</p>
+ *
+ * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.5.1 ($Revision: 215 $), $Date: 2010-09-19 22:12:08 +0200 (So, 19 Sep 2010) $
+ * 
+ */
+public abstract class AbstractFormat extends UFormat implements UnitFormat {
+
+   /**
+     * Returns the {@link SymbolMap} for this unit format.
+     *
+     * @return the symbol map used by this format.
+     */
+    protected abstract SymbolMap getSymbolMap();
+
+    /**
+     * Formats the specified unit.
+     *
+     * @param unit the unit to format.
+     * @param appendable the appendable destination.
+     * @return The appendable destination passed in as {@code appendable},
+     *         with formatted text appended.
+     * @throws IOException if an error occurs.
+     */
+    public abstract Appendable format(Unit<?> unit, Appendable appendable)
+            throws IOException;
+
+    /**
+     * Parses a portion of the specified <code>CharSequence</code> from the
+     * specified position to produce a unit. If there is no unit to parse
+     * {@link AbstractUnit#ONE} is returned.
+     *
+     * @param csq the <code>CharSequence</code> to parse.
+     * @param cursor the cursor holding the current parsing index.
+     * @return the unit parsed from the specified character sub-sequence.
+     * @throws IllegalArgumentException if any problem occurs while parsing the
+     *         specified character sequence (e.g. illegal syntax).
+     */
+    public abstract Unit<?> parse(CharSequence csq, ParsePosition cursor)
+            throws IllegalArgumentException;
+
+    /**
+     * Return a formatter for CurrencyAmount objects in the given
+     * locale.
+     * @param locale desired locale
+     * @return a formatter object
+     * @stable ICU 3.0
+     */
+    public static AbstractFormat getUnitFormat(ULocale locale) {
+        return LocalUnitFormatImpl.getInstance(locale.toLocale());
+    }
+
+    /**
+     * Return a formatter for CurrencyAmount objects in the default
+     * locale.
+     * @return a formatter object
+     * @stable ICU 3.0
+     */
+    public static AbstractFormat getUnitFormat() {
+        return getUnitFormat(ULocale.getDefault());
+    }
+    
+    /**
+     * Convenience method equivalent to {@link #format(AbstractUnit, Appendable)}
+     * except it does not raise an IOException.
+     *
+     * @param unit the unit to format.
+     * @param dest the appendable destination.
+     * @return the specified <code>StringBuilder</code>.
+     */
+    final StringBuilder format(AbstractUnit<?> unit, StringBuilder dest) {
+        try {
+            return (StringBuilder) this.format(unit, (Appendable) dest);
+        } catch (IOException ex) {
+            throw new Error(ex); // Can never happen.
+        }
+    }
+
+    /**
+     * serialVersionUID
+     */
+    private static final long serialVersionUID = -2046025267890654321L;
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/AbstractQuantity.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/AbstractQuantity.java
index b168110..83f3e78 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/AbstractQuantity.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/AbstractQuantity.java
@@ -1,771 +1,771 @@
-/**
- * Copyright (c) 2005, 2014, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.units;
-
-import java.math.BigDecimal;
-import java.math.MathContext;
-import org.unitsofmeasurement.quantity.Dimensionless;
-import org.unitsofmeasurement.quantity.Quantity;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * <p> This class represents the immutable result of a scalar IMeasure stated
- *     in a known unit.</p>
- * 
- * <p> To avoid any lost of precision, known exact measure (e.g. physical 
- *     constants) should not be created from <code>double</code> constants but
- *     from their decimal representation.<br/><code>
- *         public static final IMeasure<Number, Velocity> C = AbstractIMeasure.of("299792458 m/s").asType(Velocity.class);
- *         // Speed of Light (exact).
- *    </code></p>
- * 
- * <p> Measures can be converted to different units, the conversion precision is
- *     determined by the specified {@link MathContext}.<br/><code>
- *         IMeasure<Number, Velocity> milesPerHour = C.to(MILES_PER_HOUR, MathContext.DECIMAL128); // Use BigDecimal implementation.
- *         System.out.println(milesPerHour);
- * 
- *         > 670616629.3843951324266284896206156 [mi_i]/h
- *     </code>
- *     If no precision is specified <code>double</code> precision is assumed.<code>
- *         IMeasure<Double, Velocity> milesPerHour = C.to(MILES_PER_HOUR); // Use double implementation (fast).
- *         System.out.println(milesPerHour);
- * 
- *         > 670616629.3843951 [mi_i]/h
- *     </code></p>
- * 
- * <p> Applications may sub-class {@link AbstractQuantity} for particular IMeasures
- *     types.<br/><code>
- *         // Quantity of type Mass based on <code>double</code> primitive types.
- *         public class MassAmount extends AbstractQuantity<Mass> { 
- *             private final double _kilograms; // Internal SI representation. 
- *             private Mass(double kilograms) { _kilograms = kilograms; }
- *             public static Mass of(double value, Unit<Mass> unit) {
- *                 return new Mass(unit.getConverterTo(SI.KILOGRAM).convert(value));
- *             } 
- *             public Unit<Mass> getUnit() { return SI.KILOGRAM; } 
- *             public Double getValue() { return _kilograms; } 
- *             ...
- *         }
- * 
- *         // Complex numbers IMeasures.
- *         public class ComplexQuantity<Q extends Quantity> extends AbstractQuantity<Q> {
- *             public Complex getValue() { ... } // Assuming Complex is a Number.
- *             ... 
- *         }
- * 
- *         // Specializations of complex numbers IMeasures.
- *         public class Current extends ComplexQuantity<ElectricCurrent> {...} 
- *         public class Tension extends ComplexQuantity<ElectricPotential> {...}
- *         </code></p>
- * 
- * <p> All instances of this class shall be immutable.</p>
- * 
- * @author  <a href="mailto:units@catmedia.us">Werner Keil</a>
- * @version 1.3, $Date: 2014-04-23 $
- */
-public abstract class AbstractQuantity<Q extends Quantity<Q>> implements IMeasure<Q> {
-	
-    /**
-	 * 
-	 */
-//	private static final long serialVersionUID = -4993173119977931016L;
-    
-	private final Unit<Q> unit;
-	
-	/**
-	 * Holds a dimensionless measure of none (exact).
-	 */
-//	public static final AbstractQuantity<Dimensionless> NONE = of(0, SI.ONE);
-	
-	/**
-	 * Holds a dimensionless measure of one (exact).
-	 */
-	/**
-	 * Holds a dimensionless measure of one (exact).
-	 */
-	public static final Quantity<Dimensionless> ONE =
-			QuantityFactory.getInstance(Dimensionless.class).create(
-					BigDecimal.ONE, AbstractUnit.ONE);
-	
-	/**
-     * constructor.
-     */
-    protected AbstractQuantity(Unit<Q> unit) {
-    	this.unit = unit;
-    }
-
-    /**
-     * Returns the IMeasure numeric value.
-     *
-     * @return the IMeasure value.
-     */
-    public abstract Number getValue();
-
-    /**
-     * Returns the IMeasure unit.
-     *
-     * @return the IMeasure unit.
-     */
-    public Unit<Q> getUnit() {
-    	return unit;
-    }
-    
-    /**
-     * Returns the IMeasure unit.
-     *
-     * @return the IMeasure unit.
-     */
-    public Unit<Q> unit() {
-    	return getUnit();
-    }
-
-    /**
-     * Convenient method equivalent to {@link #to(javax.measure.unit.Unit)
-     * to(this.getUnit().toSI())}.
-     *
-     * @return this measure or a new measure equivalent to this measure but
-     *         stated in SI units.
-     * @throws ArithmeticException if the result is inexact and the quotient
-     *         has a non-terminating decimal expansion.
-     */
-    public AbstractQuantity<Q> toSI() {
-        return to(this.getUnit().getSystemUnit());
-    }
-
-    /**
-     * Returns this measure after conversion to specified unit. The default
-     * implementation returns
-     * <code>Measure.valueOf(doubleValue(unit), unit)</code>. If this measure is
-     * already stated in the specified unit, then this measure is returned and
-     * no conversion is performed.
-     *
-     * @param unit the unit in which the returned measure is stated.
-     * @return this measure or a new measure equivalent to this measure but
-     *         stated in the specified unit.
-     * @throws ArithmeticException if the result is inexact and the quotient has
-     *         a non-terminating decimal expansion.
-     */
-    public AbstractQuantity<Q> to(Unit<Q> unit) {
-        if (unit.equals(this.getUnit())) {
-            return this;
-        }
-        //return AbstractIMeasure.of(doubleValue(unit), unit);
-        return AbstractQuantity.of(decimalValue(unit, MathContext.UNLIMITED), unit);
-    }
-
-    /**
-     * Returns this measure after conversion to specified unit. The default
-     * implementation returns
-     * <code>Measure.valueOf(decimalValue(unit, ctx), unit)</code>. If this
-     * measure is already stated in the specified unit, then this measure is
-     * returned and no conversion is performed.
-     *
-     * @param unit the unit in which the returned measure is stated.
-     * @param ctx the math context to use for conversion.
-     * @return this measure or a new measure equivalent to this measure but
-     *         stated in the specified unit.
-     * @throws ArithmeticException if the result is inexact but the rounding
-     *         mode is <code>UNNECESSARY</code> or
-     *         <code>mathContext.precision == 0</code> and the quotient has
-     *         a non-terminating decimal expansion.
-     */
-    public AbstractQuantity<Q> to(Unit<Q> unit, MathContext ctx) {
-        if (unit.equals(this.getUnit())) {
-            return this;
-        }
-        return AbstractQuantity.of(decimalValue(unit, ctx), unit);
-    }
-
-    /**
-     * Compares this measure to the specified IMeasure quantity. The default
-     * implementation compares the {@link IMeasure#doubleValue(Unit)} of both
-     * this measure and the specified IMeasure stated in the same unit (this
-     * measure's {@link #getUnit() unit}).
-     *
-     * @return a negative integer, zero, or a positive integer as this measure
-     *         is less than, equal to, or greater than the specified IMeasure
-     *         quantity.
-     * @return <code>Double.compare(this.doubleValue(getUnit()),
-     *         that.doubleValue(getUnit()))</code>
-     */
-    public int compareTo(Quantity<Q> that) {
-        Unit<Q> unit = getUnit();
-        return Double.compare(doubleValue(unit), that.value().doubleValue());
-    }
-
-    /**
-     * Compares this measure against the specified object for <b>strict</b>
-     * equality (same unit and same amount).
-     *
-     * <p> Similarly to the {@link BigDecimal#equals} method which consider 2.0
-     *     and 2.00 as different objects because of different internal scales,
-     *     IMeasures such as <code>Measure.valueOf(3.0, KILOGRAM)</code>
-     *     <code>Measure.valueOf(3, KILOGRAM)</code> and
-     *     <code>Measure.valueOf("3 kg")</code> might not be considered equals
-     *     because of possible differences in their implementations.</p>
-     *
-     * <p> To compare measures stated using different units or using different
-     *     amount implementations the {@link #compareTo compareTo} or
-     *     {@link #equals(javax.measure.IMeasure, double, javax.measure.unit.Unit)
-     *      equals(IMeasure, epsilon, epsilonUnit)} methods should be used.</p>
-     *
-     * @param obj the object to compare with.
-     * @return <code>this.getUnit.equals(obj.getUnit())
-     *         && this.getValue().equals(obj.getValue())</code>
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (!(obj instanceof AbstractQuantity<?>)) {
-            return false;
-        }
-        AbstractQuantity<?> that = (AbstractQuantity<?>) obj;
-        return this.getUnit().equals(that.getUnit()) && this.getValue().equals(that.value());
-    }
-
-    /**
-     * Compares this measure and the specified IMeasure to the given accuracy.
-     * IMeasures are considered approximately equals if their absolute
-     * differences when stated in the same specified unit is less than the
-     * specified epsilon.
-     *
-     * @param that the IMeasure to compare with.
-     * @param epsilon the absolute error stated in epsilonUnit.
-     * @param epsilonUnit the epsilon unit.
-     * @return <code>abs(this.doubleValue(epsilonUnit) - that.doubleValue(epsilonUnit)) &lt;= epsilon</code>
-     */
-    public boolean equals(AbstractQuantity<Q> that, double epsilon, Unit<Q> epsilonUnit) {
-        return Math.abs(this.doubleValue(epsilonUnit) - that.doubleValue(epsilonUnit)) <= epsilon;
-    }
-
-    /**
-     * Returns the hash code for this measure.
-     *
-     * @return the hash code value.
-     */
-    @Override
-    public int hashCode() {
-        return getUnit().hashCode() + getValue().hashCode();
-    }
-
-    public abstract boolean isBig();
-    
-    /**
-     * Returns the <code>String</code> representation of this measure. The
-     * string produced for a given measure is always the same; it is not
-     * affected by locale. This means that it can be used as a canonical string
-     * representation for exchanging measure, or as a key for a Hashtable, etc.
-     * Locale-sensitive measure formatting and parsing is handled by the
-     * {@link IMeasureFormat} class and its subclasses.
-     *
-     * @return <code>UnitFormat.getInternational().format(this)</code>
-     */
-    @Override
-    public String toString() {
-        //return MeasureFormat.getStandard().format(this); TODO improve MeasureFormat
-    	return String.valueOf(getValue()) + " " + String.valueOf(getUnit());
-    }
-
-    public abstract BigDecimal decimalValue(Unit<Q> unit, MathContext ctx)
-            throws ArithmeticException;
-    
-    public abstract  double doubleValue(Unit<Q> unit)
-            throws ArithmeticException;
-    
-    // Implements AbstractIMeasure
-    public final int intValue(Unit<Q> unit) throws ArithmeticException {
-        long longValue = longValue(unit);
-        if ((longValue < Integer.MIN_VALUE) || (longValue > Integer.MAX_VALUE)) {
-            throw new ArithmeticException("Cannot convert " + longValue + " to int (overflow)");
-        }
-        return (int) longValue;
-    }
-
-    public long longValue(Unit<Q> unit) throws ArithmeticException {
-        double result = doubleValue(unit);
-        if ((result < Long.MIN_VALUE) || (result > Long.MAX_VALUE)) {
-            throw new ArithmeticException("Overflow (" + result + ")");
-        }
-        return (long) result;
-    }
-
-    protected final float floatValue(Unit<Q> unit) {
-        return (float) doubleValue(unit);
-    }
-
-    /**
-     * Casts this measure to a parameterized unit of specified nature or throw a
-     * <code>ClassCastException</code> if the dimension of the specified
-     * quantity and this measure unit's dimension do not match. For
-     * example:<br/><code>
-     *     Measure<Length> length = Measure.valueOf("2 km").asType(Length.class);
-     * </code>
-     *
-     * @param type the quantity class identifying the nature of the measure.
-     * @return this measure parameterized with the specified type.
-     * @throws ClassCastException if the dimension of this unit is different
-     *         from the specified quantity dimension.
-     * @throws UnsupportedOperationException
-     *             if the specified quantity class does not have a public static
-     *             field named "UNIT" holding the SI unit for the quantity.
-     * @see Unit#asType(Class)
-     */
-    @SuppressWarnings("unchecked")
-    public final <T extends Quantity<T>> AbstractQuantity<T> asType(Class<T> type)
-            throws ClassCastException {
-        this.getUnit().asType(type); // Raises ClassCastException is dimension
-        // mismatches.
-        return (AbstractQuantity<T>) this;
-    }
-
-    /**
-     * Returns the
-     * {@link #valueOf(java.math.BigDecimal, javax.measure.unit.Unit) decimal}
-     * measure of unknown type corresponding to the specified representation.
-     * This method can be used to parse dimensionless quantities.<br/><code>
-     *     IMeasure<Number, Dimensionless> proportion = Measure.valueOf("0.234").asType(Dimensionless.class);
-     * </code>
-     *
-     * <p> Note: This method handles only
-     * {@link javax.measure.unit.UnitFormat#getStandard standard} unit format
-     * (<a href="http://unitsofmeasure.org/">UCUM</a> based). Locale-sensitive
-     * measure formatting and parsing are handled by the {@link IMeasureFormat}
-     * class and its subclasses.</p>
-     *
-     * @param csq the decimal value and its unit (if any) separated by space(s).
-     * @return <code>MeasureFormat.getStandard().parse(csq, new ParsePosition(0))</code>
-     */
-//    public static AbstractQuantity<?> of(CharSequence csq) {
-//        try {
-//			return QuantityFormat.getInstance(LOCALE_NEUTRAL).parse(csq, new ParsePosition(0));
-//		} catch (IllegalArgumentException | ParserException e) {
-//			throw new IllegalArgumentException(e); // TODO could we handle this differently?
-//		}
-//    }
-
-    /**
-     * Returns the scalar measure for the specified <code>int</code> stated in
-     * the specified unit.
-     *
-     * @param intValue the IMeasure value.
-     * @param unit the IMeasure unit.
-     * @return the corresponding <code>int</code> measure.
-     */
-    public static <Q extends Quantity<Q>> AbstractQuantity<Q> of(int intValue,
-            Unit<Q> unit) {
-        return new IntegerQuantity<Q>(intValue, unit);
-    }
-
-    private static final class IntegerQuantity<T extends Quantity<T>> extends AbstractQuantity<T> {
-
-        /**
-		 * 
-		 */
-//		private static final long serialVersionUID = 5355395476874521709L;
-		
-		final int value;
-
-        public IntegerQuantity(int value, Unit<T> unit) {
-        	super(unit);
-        	this.value = value;
-        }
-
-        @Override
-        public Integer value() {
-            return value;
-        }
-
-        // Implements IMeasure
-        public double doubleValue(Unit<T> unit) {
-            return (super.unit.equals(unit)) ? value : super.unit.getConverterTo(unit).convert(value);
-        }
-
-        // Implements IMeasure
-        public BigDecimal decimalValue(Unit<T> unit, MathContext ctx)
-                throws ArithmeticException {
-            BigDecimal decimal = BigDecimal.valueOf(value);
-            return (super.unit.equals(unit)) ? decimal : ((AbstractConverter)super.unit.getConverterTo(unit)).convert(decimal, ctx);
-        }
-
-		@Override
-		public long longValue(Unit<T> unit) {
-	        double result = doubleValue(unit);
-	        if ((result < Long.MIN_VALUE) || (result > Long.MAX_VALUE)) {
-	            throw new ArithmeticException("Overflow (" + result + ")");
-	        }
-	        return (long) result;
-		}
-
-		@Override
-		public IMeasure<T> add(IMeasure<T> that) {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		@Override
-		public IntegerQuantity<T> subtract(IMeasure<T> that) {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		@Override
-		public IMeasure<?> multiply(IMeasure<?> that) {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		@Override
-		public IMeasure<?> multiply(Number that) {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		@Override
-		public IMeasure<?> divide(IMeasure<?> that) {
-			return of((double)value / that.value().doubleValue(), getUnit().divide(that.unit()));
-		}
-
-//		@SuppressWarnings("unchecked")
-//		@Override
-//		public IMeasure<T> inverse() {
-//			return (AbstractQuantity<T>) of(value, getUnit().inverse());
-//		}
-
-		@Override
-		public boolean isBig() {
-			return false;
-		}
-
-
-		@Override
-		public Unit<T> unit() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		@Override
-		public IMeasure<? extends IMeasure<T>> inverse() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		@Override
-		public Number getValue() {
-			return value();
-		}
-
-    }
-    
-    /**
-     * Returns the scalar measure for the specified <code>float</code> stated in
-     * the specified unit.
-     *
-     * @param floatValue the IMeasure value.
-     * @param unit the IMeasure unit.
-     * @return the corresponding <code>float</code> measure.
-     */
-    public static <Q extends Quantity<Q>> AbstractQuantity<Q> of(float floatValue,
-            Unit<Q> unit) {
-        return new FloatQuantity<Q>(floatValue, unit);
-    }
-
-    private static final class FloatQuantity<T extends Quantity<T>> extends AbstractQuantity<T> {
-
-        /**
-		 * 
-		 */
-//		private static final long serialVersionUID = 7857472738562215118L;
-		
-		final float value;
-
-        public FloatQuantity(float value, Unit<T> unit) {
-        	super(unit);
-            this.value = value;
-        }
-
-        @Override
-        public Float value() {
-            return Float.valueOf(value);
-        }
-
-        // Implements AbstractIMeasure
-        public double doubleValue(Unit<T> unit) {
-            return (super.unit.equals(unit)) ? value : super.unit.getConverterTo(unit).convert(value);
-        }
-
-        // Implements AbstractIMeasure
-        public BigDecimal decimalValue(Unit<T> unit, MathContext ctx)
-                throws ArithmeticException {
-            BigDecimal decimal = BigDecimal.valueOf(value); // TODO check value if it is a BD, otherwise use different converter
-            return (super.unit.equals(unit)) ? decimal : ((AbstractConverter)super.unit.getConverterTo(unit)).convert(decimal, ctx);
-        }
-
-		public long longValue(Unit<T> unit) {
-	        double result = doubleValue(unit);
-	        if ((result < Long.MIN_VALUE) || (result > Long.MAX_VALUE)) {
-	            throw new ArithmeticException("Overflow (" + result + ")");
-	        }
-	        return (long) result;
-		}
-
-		@Override
-		public AbstractQuantity<T> add(IMeasure<T> that) {
-			return of(value + that.value().floatValue(), getUnit()); // TODO use shift of the unit?
-		}
-
-		@Override
-		public AbstractQuantity<T> subtract(IMeasure<T> that) {
-			return of(value - that.value().floatValue(), getUnit()); // TODO use shift of the unit?
-		}
-
-		@SuppressWarnings("unchecked")
-		@Override
-		public AbstractQuantity<T> multiply(IMeasure<?> that) {
-			return (AbstractQuantity<T>) of(value * that.value().floatValue(), 
-					getUnit().multiply(that.unit()));
-		}
-
-		@Override
-		public IMeasure<?> multiply(Number that) {
-			return of(value * that.floatValue(), 
-					getUnit().multiply(that.doubleValue()));
-		}
-
-		@Override
-		public IMeasure<?> divide(IMeasure<?> that) {
-			return of(value / that.value().floatValue(), getUnit().divide(that.unit()));
-		}
-
-		@SuppressWarnings("unchecked")
-		@Override
-		public IMeasure<? extends IMeasure<T>> inverse() {
-			return (IMeasure<? extends IMeasure<T>>) of(value, getUnit().inverse());
-		}
-
-		@Override
-		public boolean isBig() {
-			return false;
-		}
-
-		public IMeasure<?> divide(Number that) {
-			return of(value / that.floatValue(), getUnit());
-		}
-
-		@Override
-		public Number getValue() {
-			return value();
-		}
-    }
-
-    /**
-     * Returns the scalar measure for the specified <code>double</code> stated
-     * in the specified unit.
-     *
-     * @param doubleValue the IMeasure value.
-     * @param unit the IMeasure unit.
-     * @return the corresponding <code>double</code> measure.
-     */
-    public static <Q extends Quantity<Q>> AbstractQuantity<Q> of(double doubleValue,
-            Unit<Q> unit) {
-        return new DoubleQuantity<Q>(doubleValue, unit);
-    }
-
-    private static final class DoubleQuantity<T extends Quantity<T>> extends AbstractQuantity<T> {
-
-        final double value;
-
-        public DoubleQuantity(double value, Unit<T> unit) {
-        	super(unit);
-            this.value = value;
-        }
-
-        @Override
-        public Double value() {
-            return Double.valueOf(value);
-        }
-
-
-        public double doubleValue(Unit<T> unit) {
-            return (super.unit.equals(unit)) ? value : super.unit.getConverterTo(unit).convert(value);
-        }
-
-        @Override
-        public BigDecimal decimalValue(Unit<T> unit, MathContext ctx)
-                throws ArithmeticException {
-            BigDecimal decimal = BigDecimal.valueOf(value); // TODO check value if it is a BD, otherwise use different converter
-            return (super.unit.equals(unit)) ? decimal : ((AbstractConverter)super.unit.getConverterTo(unit)).convert(decimal, ctx);
-        }
-
-		@Override
-		public long longValue(Unit<T> unit) {
-	        double result = doubleValue(unit);
-	        if ((result < Long.MIN_VALUE) || (result > Long.MAX_VALUE)) {
-	            throw new ArithmeticException("Overflow (" + result + ")");
-	        }
-	        return (long) result;
-		}
-
-		@Override
-		public IMeasure<T> add(IMeasure<T> that) {
-			return of(value + that.value().doubleValue(), getUnit()); // TODO use shift of the unit?
-		}
-
-		@Override
-		public IMeasure<T> subtract(IMeasure<T> that) {
-			return of(value - that.value().doubleValue(), getUnit()); // TODO use shift of the unit?
-		}
-
-		@Override
-		public IMeasure<?> multiply(IMeasure<?> that) {
-			return of(value * that.value().doubleValue(), getUnit().multiply(that.unit()));
-		}
-
-		@Override
-		public IMeasure<?> multiply(Number that) {
-			return of(value * that.doubleValue(), getUnit());
-		}
-
-		@Override
-		public IMeasure<?> divide(IMeasure<?> that) {
-			return of(value / that.value().doubleValue(), getUnit().divide(that.unit()));
-		}
-		
-		public IMeasure<?> divide(Number that) {
-			return of(value / that.doubleValue(), getUnit());
-		}
-
-//		@SuppressWarnings("unchecked")
-//		@Override
-//		public IMeasure<T> inverse() {
-//			return (AbstractQuantity<T>) of(value, getUnit().inverse());
-//		}
-
-		@Override
-		public boolean isBig() {
-			return false;
-		}
-
-		@Override
-		public IMeasure<? extends IMeasure<T>> inverse() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		@Override
-		public Number getValue() {
-			return value();
-		}
-    }
-
-    /**
-     * Returns the scalar measure for the specified <code>BigDecimal</code>
-     * stated in the specified unit.
-     *
-     * @param decimalValue the IMeasure value.
-     * @param unit the IMeasure unit.
-     * @return the corresponding <code>BigDecimal</code> measure.
-     */
-    public static <Q extends Quantity<Q>> AbstractQuantity<Q> of(
-            BigDecimal decimalValue, Unit<Q> unit) {
-        return new DecimalQuantity<Q>(decimalValue, unit);
-    }
-    
-    private static final class DecimalQuantity<T extends Quantity<T>> extends AbstractQuantity<T> {
-
-        /**
-		 * 
-		 */
-//		private static final long serialVersionUID = 6504081836032983882L;
-		final BigDecimal value;
-
-        public DecimalQuantity(BigDecimal value, Unit<T> unit) {
-        	super(unit);
-        	this.value = value;
-        }
-
-        @Override
-        public BigDecimal value() {
-            return value;
-        }
-
-        // Implements AbstractIMeasure
-        public double doubleValue(Unit<T> unit) {
-            return (unit.equals(unit)) ? value.doubleValue() : unit.getConverterTo(unit).convert(value.doubleValue());
-        }
-
-        // Implements AbstractIMeasure
-        public BigDecimal decimalValue(Unit<T> unit, MathContext ctx)
-                throws ArithmeticException {
-            return (super.unit.equals(unit)) ? value :
-            	((AbstractConverter)unit.getConverterTo(unit)).convert(value, ctx);
-        }
-
-		@Override
-		public IMeasure<T> add(IMeasure<T> that) {
-			return of(value.add((BigDecimal)that.value()), getUnit()); // TODO use shift of the unit?
-		}
-
-		@Override
-		public IMeasure<T> subtract(IMeasure<T> that) {
-			return of(value.subtract((BigDecimal)that.value()), getUnit()); // TODO use shift of the unit?
-		}
-
-		@Override
-		public AbstractQuantity<?> multiply(IMeasure<?> that) {
-			return of(value.multiply((BigDecimal)that.value()), 
-					getUnit().multiply(that.unit()));
-		}
-
-		@Override
-		public IMeasure<?> multiply(Number that) {
-			return of(value.multiply((BigDecimal)that), getUnit());
-		}
-
-		@Override
-		public IMeasure<?> divide(IMeasure<?> that) {
-			return of(value.divide((BigDecimal)that.value()), getUnit());
-		}
-
-		public IMeasure<?> divide(Number that) {
-			return of(value.divide((BigDecimal)that), getUnit());
-		}
-		
-//		@SuppressWarnings("unchecked")
-//		@Override
-//		public AbstractQuantity<T> inverse() {
-//			//return of(value.negate(), getUnit());
-//			return (AbstractQuantity<T>) of(value, getUnit().inverse());
-//		}
-
-		public long longValue(Unit<T> unit) {
-	        double result = doubleValue(unit);
-	        if ((result < Long.MIN_VALUE) || (result > Long.MAX_VALUE)) {
-	            throw new ArithmeticException("Overflow (" + result + ")");
-	        }
-	        return (long) result;
-		}
-
-		@Override
-		public boolean isBig() {
-			return false;
-		}
-
-		@Override
-		public Number getValue() {
-			return value();
-		}
-
-		@Override
-		public IMeasure<? extends IMeasure<T>> inverse() {
-			return (IMeasure<? extends IMeasure<T>>) of(value, getUnit().inverse());
-		}
-    }   
-
-}
+/**
+ * Copyright (c) 2005, 2014, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.units;
+
+import java.math.BigDecimal;
+import java.math.MathContext;
+import org.unitsofmeasurement.quantity.Dimensionless;
+import org.unitsofmeasurement.quantity.Quantity;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * <p> This class represents the immutable result of a scalar IMeasure stated
+ *     in a known unit.</p>
+ * 
+ * <p> To avoid any lost of precision, known exact measure (e.g. physical 
+ *     constants) should not be created from <code>double</code> constants but
+ *     from their decimal representation.<br/><code>
+ *         public static final IMeasure<Number, Velocity> C = AbstractIMeasure.of("299792458 m/s").asType(Velocity.class);
+ *         // Speed of Light (exact).
+ *    </code></p>
+ * 
+ * <p> Measures can be converted to different units, the conversion precision is
+ *     determined by the specified {@link MathContext}.<br/><code>
+ *         IMeasure<Number, Velocity> milesPerHour = C.to(MILES_PER_HOUR, MathContext.DECIMAL128); // Use BigDecimal implementation.
+ *         System.out.println(milesPerHour);
+ * 
+ *         > 670616629.3843951324266284896206156 [mi_i]/h
+ *     </code>
+ *     If no precision is specified <code>double</code> precision is assumed.<code>
+ *         IMeasure<Double, Velocity> milesPerHour = C.to(MILES_PER_HOUR); // Use double implementation (fast).
+ *         System.out.println(milesPerHour);
+ * 
+ *         > 670616629.3843951 [mi_i]/h
+ *     </code></p>
+ * 
+ * <p> Applications may sub-class {@link AbstractQuantity} for particular IMeasures
+ *     types.<br/><code>
+ *         // Quantity of type Mass based on <code>double</code> primitive types.
+ *         public class MassAmount extends AbstractQuantity<Mass> { 
+ *             private final double _kilograms; // Internal SI representation. 
+ *             private Mass(double kilograms) { _kilograms = kilograms; }
+ *             public static Mass of(double value, Unit<Mass> unit) {
+ *                 return new Mass(unit.getConverterTo(SI.KILOGRAM).convert(value));
+ *             } 
+ *             public Unit<Mass> getUnit() { return SI.KILOGRAM; } 
+ *             public Double getValue() { return _kilograms; } 
+ *             ...
+ *         }
+ * 
+ *         // Complex numbers IMeasures.
+ *         public class ComplexQuantity<Q extends Quantity> extends AbstractQuantity<Q> {
+ *             public Complex getValue() { ... } // Assuming Complex is a Number.
+ *             ... 
+ *         }
+ * 
+ *         // Specializations of complex numbers IMeasures.
+ *         public class Current extends ComplexQuantity<ElectricCurrent> {...} 
+ *         public class Tension extends ComplexQuantity<ElectricPotential> {...}
+ *         </code></p>
+ * 
+ * <p> All instances of this class shall be immutable.</p>
+ * 
+ * @author  <a href="mailto:units@catmedia.us">Werner Keil</a>
+ * @version 1.3, $Date: 2014-04-23 $
+ */
+public abstract class AbstractQuantity<Q extends Quantity<Q>> implements IMeasure<Q> {
+	
+    /**
+	 * 
+	 */
+//	private static final long serialVersionUID = -4993173119977931016L;
+    
+	private final Unit<Q> unit;
+	
+	/**
+	 * Holds a dimensionless measure of none (exact).
+	 */
+//	public static final AbstractQuantity<Dimensionless> NONE = of(0, SI.ONE);
+	
+	/**
+	 * Holds a dimensionless measure of one (exact).
+	 */
+	/**
+	 * Holds a dimensionless measure of one (exact).
+	 */
+	public static final Quantity<Dimensionless> ONE =
+			QuantityFactory.getInstance(Dimensionless.class).create(
+					BigDecimal.ONE, AbstractUnit.ONE);
+	
+	/**
+     * constructor.
+     */
+    protected AbstractQuantity(Unit<Q> unit) {
+    	this.unit = unit;
+    }
+
+    /**
+     * Returns the IMeasure numeric value.
+     *
+     * @return the IMeasure value.
+     */
+    public abstract Number getValue();
+
+    /**
+     * Returns the IMeasure unit.
+     *
+     * @return the IMeasure unit.
+     */
+    public Unit<Q> getUnit() {
+    	return unit;
+    }
+    
+    /**
+     * Returns the IMeasure unit.
+     *
+     * @return the IMeasure unit.
+     */
+    public Unit<Q> unit() {
+    	return getUnit();
+    }
+
+    /**
+     * Convenient method equivalent to {@link #to(javax.measure.unit.Unit)
+     * to(this.getUnit().toSI())}.
+     *
+     * @return this measure or a new measure equivalent to this measure but
+     *         stated in SI units.
+     * @throws ArithmeticException if the result is inexact and the quotient
+     *         has a non-terminating decimal expansion.
+     */
+    public AbstractQuantity<Q> toSI() {
+        return to(this.getUnit().getSystemUnit());
+    }
+
+    /**
+     * Returns this measure after conversion to specified unit. The default
+     * implementation returns
+     * <code>Measure.valueOf(doubleValue(unit), unit)</code>. If this measure is
+     * already stated in the specified unit, then this measure is returned and
+     * no conversion is performed.
+     *
+     * @param unit the unit in which the returned measure is stated.
+     * @return this measure or a new measure equivalent to this measure but
+     *         stated in the specified unit.
+     * @throws ArithmeticException if the result is inexact and the quotient has
+     *         a non-terminating decimal expansion.
+     */
+    public AbstractQuantity<Q> to(Unit<Q> unit) {
+        if (unit.equals(this.getUnit())) {
+            return this;
+        }
+        //return AbstractIMeasure.of(doubleValue(unit), unit);
+        return AbstractQuantity.of(decimalValue(unit, MathContext.UNLIMITED), unit);
+    }
+
+    /**
+     * Returns this measure after conversion to specified unit. The default
+     * implementation returns
+     * <code>Measure.valueOf(decimalValue(unit, ctx), unit)</code>. If this
+     * measure is already stated in the specified unit, then this measure is
+     * returned and no conversion is performed.
+     *
+     * @param unit the unit in which the returned measure is stated.
+     * @param ctx the math context to use for conversion.
+     * @return this measure or a new measure equivalent to this measure but
+     *         stated in the specified unit.
+     * @throws ArithmeticException if the result is inexact but the rounding
+     *         mode is <code>UNNECESSARY</code> or
+     *         <code>mathContext.precision == 0</code> and the quotient has
+     *         a non-terminating decimal expansion.
+     */
+    public AbstractQuantity<Q> to(Unit<Q> unit, MathContext ctx) {
+        if (unit.equals(this.getUnit())) {
+            return this;
+        }
+        return AbstractQuantity.of(decimalValue(unit, ctx), unit);
+    }
+
+    /**
+     * Compares this measure to the specified IMeasure quantity. The default
+     * implementation compares the {@link IMeasure#doubleValue(Unit)} of both
+     * this measure and the specified IMeasure stated in the same unit (this
+     * measure's {@link #getUnit() unit}).
+     *
+     * @return a negative integer, zero, or a positive integer as this measure
+     *         is less than, equal to, or greater than the specified IMeasure
+     *         quantity.
+     * @return <code>Double.compare(this.doubleValue(getUnit()),
+     *         that.doubleValue(getUnit()))</code>
+     */
+    public int compareTo(Quantity<Q> that) {
+        Unit<Q> unit = getUnit();
+        return Double.compare(doubleValue(unit), that.value().doubleValue());
+    }
+
+    /**
+     * Compares this measure against the specified object for <b>strict</b>
+     * equality (same unit and same amount).
+     *
+     * <p> Similarly to the {@link BigDecimal#equals} method which consider 2.0
+     *     and 2.00 as different objects because of different internal scales,
+     *     IMeasures such as <code>Measure.valueOf(3.0, KILOGRAM)</code>
+     *     <code>Measure.valueOf(3, KILOGRAM)</code> and
+     *     <code>Measure.valueOf("3 kg")</code> might not be considered equals
+     *     because of possible differences in their implementations.</p>
+     *
+     * <p> To compare measures stated using different units or using different
+     *     amount implementations the {@link #compareTo compareTo} or
+     *     {@link #equals(javax.measure.IMeasure, double, javax.measure.unit.Unit)
+     *      equals(IMeasure, epsilon, epsilonUnit)} methods should be used.</p>
+     *
+     * @param obj the object to compare with.
+     * @return <code>this.getUnit.equals(obj.getUnit())
+     *         && this.getValue().equals(obj.getValue())</code>
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof AbstractQuantity<?>)) {
+            return false;
+        }
+        AbstractQuantity<?> that = (AbstractQuantity<?>) obj;
+        return this.getUnit().equals(that.getUnit()) && this.getValue().equals(that.value());
+    }
+
+    /**
+     * Compares this measure and the specified IMeasure to the given accuracy.
+     * IMeasures are considered approximately equals if their absolute
+     * differences when stated in the same specified unit is less than the
+     * specified epsilon.
+     *
+     * @param that the IMeasure to compare with.
+     * @param epsilon the absolute error stated in epsilonUnit.
+     * @param epsilonUnit the epsilon unit.
+     * @return <code>abs(this.doubleValue(epsilonUnit) - that.doubleValue(epsilonUnit)) &lt;= epsilon</code>
+     */
+    public boolean equals(AbstractQuantity<Q> that, double epsilon, Unit<Q> epsilonUnit) {
+        return Math.abs(this.doubleValue(epsilonUnit) - that.doubleValue(epsilonUnit)) <= epsilon;
+    }
+
+    /**
+     * Returns the hash code for this measure.
+     *
+     * @return the hash code value.
+     */
+    @Override
+    public int hashCode() {
+        return getUnit().hashCode() + getValue().hashCode();
+    }
+
+    public abstract boolean isBig();
+    
+    /**
+     * Returns the <code>String</code> representation of this measure. The
+     * string produced for a given measure is always the same; it is not
+     * affected by locale. This means that it can be used as a canonical string
+     * representation for exchanging measure, or as a key for a Hashtable, etc.
+     * Locale-sensitive measure formatting and parsing is handled by the
+     * {@link IMeasureFormat} class and its subclasses.
+     *
+     * @return <code>UnitFormat.getInternational().format(this)</code>
+     */
+    @Override
+    public String toString() {
+        //return MeasureFormat.getStandard().format(this); TODO improve MeasureFormat
+    	return String.valueOf(getValue()) + " " + String.valueOf(getUnit());
+    }
+
+    public abstract BigDecimal decimalValue(Unit<Q> unit, MathContext ctx)
+            throws ArithmeticException;
+    
+    public abstract  double doubleValue(Unit<Q> unit)
+            throws ArithmeticException;
+    
+    // Implements AbstractIMeasure
+    public final int intValue(Unit<Q> unit) throws ArithmeticException {
+        long longValue = longValue(unit);
+        if ((longValue < Integer.MIN_VALUE) || (longValue > Integer.MAX_VALUE)) {
+            throw new ArithmeticException("Cannot convert " + longValue + " to int (overflow)");
+        }
+        return (int) longValue;
+    }
+
+    public long longValue(Unit<Q> unit) throws ArithmeticException {
+        double result = doubleValue(unit);
+        if ((result < Long.MIN_VALUE) || (result > Long.MAX_VALUE)) {
+            throw new ArithmeticException("Overflow (" + result + ")");
+        }
+        return (long) result;
+    }
+
+    protected final float floatValue(Unit<Q> unit) {
+        return (float) doubleValue(unit);
+    }
+
+    /**
+     * Casts this measure to a parameterized unit of specified nature or throw a
+     * <code>ClassCastException</code> if the dimension of the specified
+     * quantity and this measure unit's dimension do not match. For
+     * example:<br/><code>
+     *     Measure<Length> length = Measure.valueOf("2 km").asType(Length.class);
+     * </code>
+     *
+     * @param type the quantity class identifying the nature of the measure.
+     * @return this measure parameterized with the specified type.
+     * @throws ClassCastException if the dimension of this unit is different
+     *         from the specified quantity dimension.
+     * @throws UnsupportedOperationException
+     *             if the specified quantity class does not have a public static
+     *             field named "UNIT" holding the SI unit for the quantity.
+     * @see Unit#asType(Class)
+     */
+    @SuppressWarnings("unchecked")
+    public final <T extends Quantity<T>> AbstractQuantity<T> asType(Class<T> type)
+            throws ClassCastException {
+        this.getUnit().asType(type); // Raises ClassCastException is dimension
+        // mismatches.
+        return (AbstractQuantity<T>) this;
+    }
+
+    /**
+     * Returns the
+     * {@link #valueOf(java.math.BigDecimal, javax.measure.unit.Unit) decimal}
+     * measure of unknown type corresponding to the specified representation.
+     * This method can be used to parse dimensionless quantities.<br/><code>
+     *     IMeasure<Number, Dimensionless> proportion = Measure.valueOf("0.234").asType(Dimensionless.class);
+     * </code>
+     *
+     * <p> Note: This method handles only
+     * {@link javax.measure.unit.UnitFormat#getStandard standard} unit format
+     * (<a href="http://unitsofmeasure.org/">UCUM</a> based). Locale-sensitive
+     * measure formatting and parsing are handled by the {@link IMeasureFormat}
+     * class and its subclasses.</p>
+     *
+     * @param csq the decimal value and its unit (if any) separated by space(s).
+     * @return <code>MeasureFormat.getStandard().parse(csq, new ParsePosition(0))</code>
+     */
+//    public static AbstractQuantity<?> of(CharSequence csq) {
+//        try {
+//			return QuantityFormat.getInstance(LOCALE_NEUTRAL).parse(csq, new ParsePosition(0));
+//		} catch (IllegalArgumentException | ParserException e) {
+//			throw new IllegalArgumentException(e); // TODO could we handle this differently?
+//		}
+//    }
+
+    /**
+     * Returns the scalar measure for the specified <code>int</code> stated in
+     * the specified unit.
+     *
+     * @param intValue the IMeasure value.
+     * @param unit the IMeasure unit.
+     * @return the corresponding <code>int</code> measure.
+     */
+    public static <Q extends Quantity<Q>> AbstractQuantity<Q> of(int intValue,
+            Unit<Q> unit) {
+        return new IntegerQuantity<Q>(intValue, unit);
+    }
+
+    private static final class IntegerQuantity<T extends Quantity<T>> extends AbstractQuantity<T> {
+
+        /**
+		 * 
+		 */
+//		private static final long serialVersionUID = 5355395476874521709L;
+		
+		final int value;
+
+        public IntegerQuantity(int value, Unit<T> unit) {
+        	super(unit);
+        	this.value = value;
+        }
+
+        @Override
+        public Integer value() {
+            return value;
+        }
+
+        // Implements IMeasure
+        public double doubleValue(Unit<T> unit) {
+            return (super.unit.equals(unit)) ? value : super.unit.getConverterTo(unit).convert(value);
+        }
+
+        // Implements IMeasure
+        public BigDecimal decimalValue(Unit<T> unit, MathContext ctx)
+                throws ArithmeticException {
+            BigDecimal decimal = BigDecimal.valueOf(value);
+            return (super.unit.equals(unit)) ? decimal : ((AbstractConverter)super.unit.getConverterTo(unit)).convert(decimal, ctx);
+        }
+
+		@Override
+		public long longValue(Unit<T> unit) {
+	        double result = doubleValue(unit);
+	        if ((result < Long.MIN_VALUE) || (result > Long.MAX_VALUE)) {
+	            throw new ArithmeticException("Overflow (" + result + ")");
+	        }
+	        return (long) result;
+		}
+
+		@Override
+		public IMeasure<T> add(IMeasure<T> that) {
+			// TODO Auto-generated method stub
+			return null;
+		}
+
+		@Override
+		public IntegerQuantity<T> subtract(IMeasure<T> that) {
+			// TODO Auto-generated method stub
+			return null;
+		}
+
+		@Override
+		public IMeasure<?> multiply(IMeasure<?> that) {
+			// TODO Auto-generated method stub
+			return null;
+		}
+
+		@Override
+		public IMeasure<?> multiply(Number that) {
+			// TODO Auto-generated method stub
+			return null;
+		}
+
+		@Override
+		public IMeasure<?> divide(IMeasure<?> that) {
+			return of((double)value / that.value().doubleValue(), getUnit().divide(that.unit()));
+		}
+
+//		@SuppressWarnings("unchecked")
+//		@Override
+//		public IMeasure<T> inverse() {
+//			return (AbstractQuantity<T>) of(value, getUnit().inverse());
+//		}
+
+		@Override
+		public boolean isBig() {
+			return false;
+		}
+
+
+		@Override
+		public Unit<T> unit() {
+			// TODO Auto-generated method stub
+			return null;
+		}
+
+		@Override
+		public IMeasure<? extends IMeasure<T>> inverse() {
+			// TODO Auto-generated method stub
+			return null;
+		}
+
+		@Override
+		public Number getValue() {
+			return value();
+		}
+
+    }
+    
+    /**
+     * Returns the scalar measure for the specified <code>float</code> stated in
+     * the specified unit.
+     *
+     * @param floatValue the IMeasure value.
+     * @param unit the IMeasure unit.
+     * @return the corresponding <code>float</code> measure.
+     */
+    public static <Q extends Quantity<Q>> AbstractQuantity<Q> of(float floatValue,
+            Unit<Q> unit) {
+        return new FloatQuantity<Q>(floatValue, unit);
+    }
+
+    private static final class FloatQuantity<T extends Quantity<T>> extends AbstractQuantity<T> {
+
+        /**
+		 * 
+		 */
+//		private static final long serialVersionUID = 7857472738562215118L;
+		
+		final float value;
+
+        public FloatQuantity(float value, Unit<T> unit) {
+        	super(unit);
+            this.value = value;
+        }
+
+        @Override
+        public Float value() {
+            return Float.valueOf(value);
+        }
+
+        // Implements AbstractIMeasure
+        public double doubleValue(Unit<T> unit) {
+            return (super.unit.equals(unit)) ? value : super.unit.getConverterTo(unit).convert(value);
+        }
+
+        // Implements AbstractIMeasure
+        public BigDecimal decimalValue(Unit<T> unit, MathContext ctx)
+                throws ArithmeticException {
+            BigDecimal decimal = BigDecimal.valueOf(value); // TODO check value if it is a BD, otherwise use different converter
+            return (super.unit.equals(unit)) ? decimal : ((AbstractConverter)super.unit.getConverterTo(unit)).convert(decimal, ctx);
+        }
+
+		public long longValue(Unit<T> unit) {
+	        double result = doubleValue(unit);
+	        if ((result < Long.MIN_VALUE) || (result > Long.MAX_VALUE)) {
+	            throw new ArithmeticException("Overflow (" + result + ")");
+	        }
+	        return (long) result;
+		}
+
+		@Override
+		public AbstractQuantity<T> add(IMeasure<T> that) {
+			return of(value + that.value().floatValue(), getUnit()); // TODO use shift of the unit?
+		}
+
+		@Override
+		public AbstractQuantity<T> subtract(IMeasure<T> that) {
+			return of(value - that.value().floatValue(), getUnit()); // TODO use shift of the unit?
+		}
+
+		@SuppressWarnings("unchecked")
+		@Override
+		public AbstractQuantity<T> multiply(IMeasure<?> that) {
+			return (AbstractQuantity<T>) of(value * that.value().floatValue(), 
+					getUnit().multiply(that.unit()));
+		}
+
+		@Override
+		public IMeasure<?> multiply(Number that) {
+			return of(value * that.floatValue(), 
+					getUnit().multiply(that.doubleValue()));
+		}
+
+		@Override
+		public IMeasure<?> divide(IMeasure<?> that) {
+			return of(value / that.value().floatValue(), getUnit().divide(that.unit()));
+		}
+
+		@SuppressWarnings("unchecked")
+		@Override
+		public IMeasure<? extends IMeasure<T>> inverse() {
+			return (IMeasure<? extends IMeasure<T>>) of(value, getUnit().inverse());
+		}
+
+		@Override
+		public boolean isBig() {
+			return false;
+		}
+
+		public IMeasure<?> divide(Number that) {
+			return of(value / that.floatValue(), getUnit());
+		}
+
+		@Override
+		public Number getValue() {
+			return value();
+		}
+    }
+
+    /**
+     * Returns the scalar measure for the specified <code>double</code> stated
+     * in the specified unit.
+     *
+     * @param doubleValue the IMeasure value.
+     * @param unit the IMeasure unit.
+     * @return the corresponding <code>double</code> measure.
+     */
+    public static <Q extends Quantity<Q>> AbstractQuantity<Q> of(double doubleValue,
+            Unit<Q> unit) {
+        return new DoubleQuantity<Q>(doubleValue, unit);
+    }
+
+    private static final class DoubleQuantity<T extends Quantity<T>> extends AbstractQuantity<T> {
+
+        final double value;
+
+        public DoubleQuantity(double value, Unit<T> unit) {
+        	super(unit);
+            this.value = value;
+        }
+
+        @Override
+        public Double value() {
+            return Double.valueOf(value);
+        }
+
+
+        public double doubleValue(Unit<T> unit) {
+            return (super.unit.equals(unit)) ? value : super.unit.getConverterTo(unit).convert(value);
+        }
+
+        @Override
+        public BigDecimal decimalValue(Unit<T> unit, MathContext ctx)
+                throws ArithmeticException {
+            BigDecimal decimal = BigDecimal.valueOf(value); // TODO check value if it is a BD, otherwise use different converter
+            return (super.unit.equals(unit)) ? decimal : ((AbstractConverter)super.unit.getConverterTo(unit)).convert(decimal, ctx);
+        }
+
+		@Override
+		public long longValue(Unit<T> unit) {
+	        double result = doubleValue(unit);
+	        if ((result < Long.MIN_VALUE) || (result > Long.MAX_VALUE)) {
+	            throw new ArithmeticException("Overflow (" + result + ")");
+	        }
+	        return (long) result;
+		}
+
+		@Override
+		public IMeasure<T> add(IMeasure<T> that) {
+			return of(value + that.value().doubleValue(), getUnit()); // TODO use shift of the unit?
+		}
+
+		@Override
+		public IMeasure<T> subtract(IMeasure<T> that) {
+			return of(value - that.value().doubleValue(), getUnit()); // TODO use shift of the unit?
+		}
+
+		@Override
+		public IMeasure<?> multiply(IMeasure<?> that) {
+			return of(value * that.value().doubleValue(), getUnit().multiply(that.unit()));
+		}
+
+		@Override
+		public IMeasure<?> multiply(Number that) {
+			return of(value * that.doubleValue(), getUnit());
+		}
+
+		@Override
+		public IMeasure<?> divide(IMeasure<?> that) {
+			return of(value / that.value().doubleValue(), getUnit().divide(that.unit()));
+		}
+		
+		public IMeasure<?> divide(Number that) {
+			return of(value / that.doubleValue(), getUnit());
+		}
+
+//		@SuppressWarnings("unchecked")
+//		@Override
+//		public IMeasure<T> inverse() {
+//			return (AbstractQuantity<T>) of(value, getUnit().inverse());
+//		}
+
+		@Override
+		public boolean isBig() {
+			return false;
+		}
+
+		@Override
+		public IMeasure<? extends IMeasure<T>> inverse() {
+			// TODO Auto-generated method stub
+			return null;
+		}
+
+		@Override
+		public Number getValue() {
+			return value();
+		}
+    }
+
+    /**
+     * Returns the scalar measure for the specified <code>BigDecimal</code>
+     * stated in the specified unit.
+     *
+     * @param decimalValue the IMeasure value.
+     * @param unit the IMeasure unit.
+     * @return the corresponding <code>BigDecimal</code> measure.
+     */
+    public static <Q extends Quantity<Q>> AbstractQuantity<Q> of(
+            BigDecimal decimalValue, Unit<Q> unit) {
+        return new DecimalQuantity<Q>(decimalValue, unit);
+    }
+    
+    private static final class DecimalQuantity<T extends Quantity<T>> extends AbstractQuantity<T> {
+
+        /**
+		 * 
+		 */
+//		private static final long serialVersionUID = 6504081836032983882L;
+		final BigDecimal value;
+
+        public DecimalQuantity(BigDecimal value, Unit<T> unit) {
+        	super(unit);
+        	this.value = value;
+        }
+
+        @Override
+        public BigDecimal value() {
+            return value;
+        }
+
+        // Implements AbstractIMeasure
+        public double doubleValue(Unit<T> unit) {
+            return (unit.equals(unit)) ? value.doubleValue() : unit.getConverterTo(unit).convert(value.doubleValue());
+        }
+
+        // Implements AbstractIMeasure
+        public BigDecimal decimalValue(Unit<T> unit, MathContext ctx)
+                throws ArithmeticException {
+            return (super.unit.equals(unit)) ? value :
+            	((AbstractConverter)unit.getConverterTo(unit)).convert(value, ctx);
+        }
+
+		@Override
+		public IMeasure<T> add(IMeasure<T> that) {
+			return of(value.add((BigDecimal)that.value()), getUnit()); // TODO use shift of the unit?
+		}
+
+		@Override
+		public IMeasure<T> subtract(IMeasure<T> that) {
+			return of(value.subtract((BigDecimal)that.value()), getUnit()); // TODO use shift of the unit?
+		}
+
+		@Override
+		public AbstractQuantity<?> multiply(IMeasure<?> that) {
+			return of(value.multiply((BigDecimal)that.value()), 
+					getUnit().multiply(that.unit()));
+		}
+
+		@Override
+		public IMeasure<?> multiply(Number that) {
+			return of(value.multiply((BigDecimal)that), getUnit());
+		}
+
+		@Override
+		public IMeasure<?> divide(IMeasure<?> that) {
+			return of(value.divide((BigDecimal)that.value()), getUnit());
+		}
+
+		public IMeasure<?> divide(Number that) {
+			return of(value.divide((BigDecimal)that), getUnit());
+		}
+		
+//		@SuppressWarnings("unchecked")
+//		@Override
+//		public AbstractQuantity<T> inverse() {
+//			//return of(value.negate(), getUnit());
+//			return (AbstractQuantity<T>) of(value, getUnit().inverse());
+//		}
+
+		public long longValue(Unit<T> unit) {
+	        double result = doubleValue(unit);
+	        if ((result < Long.MIN_VALUE) || (result > Long.MAX_VALUE)) {
+	            throw new ArithmeticException("Overflow (" + result + ")");
+	        }
+	        return (long) result;
+		}
+
+		@Override
+		public boolean isBig() {
+			return false;
+		}
+
+		@Override
+		public Number getValue() {
+			return value();
+		}
+
+		@Override
+		public IMeasure<? extends IMeasure<T>> inverse() {
+			return (IMeasure<? extends IMeasure<T>>) of(value, getUnit().inverse());
+		}
+    }   
+
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/Activator.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/Activator.java
index 4520aed..dbdb4fa 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/Activator.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/Activator.java
@@ -1,135 +1,135 @@
-/**
- * Copyright (c) 2005, 2011, Werner Keil, JScience and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.units;
-
-import java.util.Dictionary;
-import java.util.Hashtable;
-import java.util.Locale;
-
-import org.eclipse.uomo.units.impl.format.UnitFormatServiceImpl;
-import org.eclipse.uomo.units.impl.system.SystemOfUnitsServiceImpl;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceEvent;
-import org.osgi.framework.ServiceListener;
-import org.osgi.util.tracker.ServiceTracker;
-import org.unitsofmeasurement.service.UnitFormatService;
-import org.unitsofmeasurement.service.SystemOfUnitsService;
-import org.unitsofmeasurement.unit.SystemOfUnits;
-
-/**
- * OSGi part of implementation.
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 0.5.2 ($Revision: 215 $), $Date: 2010-09-19 22:12:08 +0200 (So, 19 Sep 2010) $
- */
-public class Activator implements BundleActivator, ServiceListener {
-	private SystemOfUnitsService souService;
-	private ServiceTracker souServiceTracker;
-	private UnitFormatService formatService;
-	private ServiceTracker formatServiceTracker;
-	private BundleContext fContext;
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		fContext = context;
-		
-		// register the services
-		startFormat(context, null);
-		startSOU(context, null);
-//		startDictionary(context, props);
-	}
-	
-	private void startFormat(BundleContext context, Dictionary<String, ?> props) throws Exception {
-		formatService = new UnitFormatServiceImpl();
-		
-		// register the service
-		context.registerService(UnitFormatService.class.getName(), formatService, props);
-
-		// create a tracker and track the service
-		formatServiceTracker = new ServiceTracker(context, UnitFormatService.class.getName(), null);
-		formatServiceTracker.open();
-
-		// have a service listener to implement the whiteboard pattern
-	    fContext.addServiceListener(this, "(objectclass=" + Locale.class.getName() + ")");
-		
-		// grab the service
-//		formatService = (LocalFormatService) formatServiceTracker.getService();
-		
-		// register the locale
-//		formatService.registerDictionary(new DictionaryImpl());
-	}
-	
-	private void startSOU(BundleContext context, Dictionary<String, ?> props) throws Exception {
-		souService = new SystemOfUnitsServiceImpl();
-		
-		// register the service
-		context.registerService(SystemOfUnitsService.class.getName(), souService, props);
-
-		// create a tracker and track the service
-		souServiceTracker = new ServiceTracker(context, SystemOfUnitsService.class.getName(), null);
-		souServiceTracker.open();
-
-		// have a service listener to implement the whiteboard pattern
-	    fContext.addServiceListener(this, "(objectclass=" + SystemOfUnits.class.getName() + ")");
-		
-		// grab the service
-//		formatService = (LocalFormatService) formatServiceTracker.getService();
-		
-	}	
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		// close the service tracker(s)
-		stopFormat();
-		stopSOU();
-//		stopDictionary();
-		fContext = null;
-	}
-	
-	private void stopFormat() throws Exception {
-		formatServiceTracker.close();
-		formatServiceTracker = null;
-
-		formatService = null;
-	}
-	
-	private void stopSOU() throws Exception {
-		souServiceTracker.close();
-		souServiceTracker = null;
-
-		souService = null;
-	}
-
-	public void serviceChanged(ServiceEvent ev) {
-//		ServiceReference sr = ev.getServiceReference();
-		switch(ev.getType()) {
-			case ServiceEvent.REGISTERED:
-			{
-//				Dictionary dictionary = (Dictionary) fContext.getService(sr);
-//				dictService.registerDictionary(dictionary);
-			}
-			break;
-			case ServiceEvent.UNREGISTERING:
-			{
-//				Dictionary dictionary = (Dictionary) fContext.getService(sr);
-//				dictService.unregisterDictionary(dictionary);
-			}
-			break;
-		}
-	}
-
-}
+/**
+ * Copyright (c) 2005, 2011, Werner Keil, JScience and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.units;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Locale;
+
+import org.eclipse.uomo.units.impl.format.UnitFormatServiceImpl;
+import org.eclipse.uomo.units.impl.system.SystemOfUnitsServiceImpl;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.util.tracker.ServiceTracker;
+import org.unitsofmeasurement.service.UnitFormatService;
+import org.unitsofmeasurement.service.SystemOfUnitsService;
+import org.unitsofmeasurement.unit.SystemOfUnits;
+
+/**
+ * OSGi part of implementation.
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 0.5.2 ($Revision: 215 $), $Date: 2010-09-19 22:12:08 +0200 (So, 19 Sep 2010) $
+ */
+public class Activator implements BundleActivator, ServiceListener {
+	private SystemOfUnitsService souService;
+	private ServiceTracker souServiceTracker;
+	private UnitFormatService formatService;
+	private ServiceTracker formatServiceTracker;
+	private BundleContext fContext;
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		fContext = context;
+		
+		// register the services
+		startFormat(context, null);
+		startSOU(context, null);
+//		startDictionary(context, props);
+	}
+	
+	private void startFormat(BundleContext context, Dictionary<String, ?> props) throws Exception {
+		formatService = new UnitFormatServiceImpl();
+		
+		// register the service
+		context.registerService(UnitFormatService.class.getName(), formatService, props);
+
+		// create a tracker and track the service
+		formatServiceTracker = new ServiceTracker(context, UnitFormatService.class.getName(), null);
+		formatServiceTracker.open();
+
+		// have a service listener to implement the whiteboard pattern
+	    fContext.addServiceListener(this, "(objectclass=" + Locale.class.getName() + ")");
+		
+		// grab the service
+//		formatService = (LocalFormatService) formatServiceTracker.getService();
+		
+		// register the locale
+//		formatService.registerDictionary(new DictionaryImpl());
+	}
+	
+	private void startSOU(BundleContext context, Dictionary<String, ?> props) throws Exception {
+		souService = new SystemOfUnitsServiceImpl();
+		
+		// register the service
+		context.registerService(SystemOfUnitsService.class.getName(), souService, props);
+
+		// create a tracker and track the service
+		souServiceTracker = new ServiceTracker(context, SystemOfUnitsService.class.getName(), null);
+		souServiceTracker.open();
+
+		// have a service listener to implement the whiteboard pattern
+	    fContext.addServiceListener(this, "(objectclass=" + SystemOfUnits.class.getName() + ")");
+		
+		// grab the service
+//		formatService = (LocalFormatService) formatServiceTracker.getService();
+		
+	}	
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		// close the service tracker(s)
+		stopFormat();
+		stopSOU();
+//		stopDictionary();
+		fContext = null;
+	}
+	
+	private void stopFormat() throws Exception {
+		formatServiceTracker.close();
+		formatServiceTracker = null;
+
+		formatService = null;
+	}
+	
+	private void stopSOU() throws Exception {
+		souServiceTracker.close();
+		souServiceTracker = null;
+
+		souService = null;
+	}
+
+	public void serviceChanged(ServiceEvent ev) {
+//		ServiceReference sr = ev.getServiceReference();
+		switch(ev.getType()) {
+			case ServiceEvent.REGISTERED:
+			{
+//				Dictionary dictionary = (Dictionary) fContext.getService(sr);
+//				dictService.registerDictionary(dictionary);
+			}
+			break;
+			case ServiceEvent.UNREGISTERING:
+			{
+//				Dictionary dictionary = (Dictionary) fContext.getService(sr);
+//				dictService.unregisterDictionary(dictionary);
+			}
+			break;
+		}
+	}
+
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/IMeasure.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/IMeasure.java
index 5297bf7..b75aa18 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/IMeasure.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/IMeasure.java
@@ -1,121 +1,121 @@
-/**
- * Copyright (c) 2005, 2012, Werner Keil, JScience and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.units;
-
-import org.unitsofmeasurement.quantity.Quantity;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * <p> This interface represents the IMeasure, countable, or comparable 
- *     property or aspect of a thing.</p>
- *     
- * <p> Implementing instances are typically the result of a measurement:[code]
- *         IMeasure<Mass> weight = BaseAmount.valueOf(180.0, POUND);
- *     [/code]
- *     They can also be created from custom classes:[code]
- *     class Delay implements IMeasure<Duration> {
- *          private long nanoSeconds; // Implicit internal unit.
- *          public double doubleValue(Unit<Velocity> unit) { ... }
- *          public long longValue(Unit<Velocity> unit) { ... }
- *     }
- *     Thread.wait(new Delay(24, HOUR)); // Assuming Thread.wait(IMeasure<Duration>) method.
- *     [/code]</p>
- *     
- * <p> Although IMeasure instances are for the most part scalar quantities; 
- *     more complex implementations (e.g. vectors, data set) are allowed as 
- *     long as an aggregate magnitude can be determined. For example:[code]
- *     class Velocity3D implements IMeasure<Velocity> {
- *          private double x, y, z; // Meter per seconds.
- *          public double doubleValue(Unit<Velocity> unit) { ... } // Returns vector norm.
- *          ... 
- *     }
- *     class Sensors<Q extends Quantity> extends QuantityAmount<double[], Q> {
- *          public doubleValue(Unit<Q> unit) { ... } // Returns median value. 
- *          ...
- *     } [/code]</p>
- * 
- * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 0.4.2, $Date: 2014-08-03 $
- * @param <Q>
- */
-public interface IMeasure<Q extends Quantity<Q>> extends Quantity<Q> {    
-        
-    /**
-     * Returns the sum of this amount with the one specified.
-     *
-     * @param  that the amount to be added.
-     * @return <code>this + that</code>.
-     */
-    IMeasure<Q> add(IMeasure<Q> that);
-    
-    /**
-     * Returns the difference between this amount and the one specified.
-     *
-     * @param  that the number to be subtracted.
-     * @return <code>this - that</code>.
-     */
-    IMeasure<Q> subtract(IMeasure<Q> that);
-    
-    /**
-     * Returns the product of this amount with the one specified.
-     *
-     * @param  that the amount multiplier.
-     * @return <code>this · that</code>.
-     */
-    IMeasure<?> multiply(IMeasure<?> that);
-    
-    /**
-     * Returns the product of this amount with the number specified.
-     *
-     * @param  that the number multiplier.
-     * @return <code>this · that</code>.
-     */
-    IMeasure<?> multiply(Number that);
-    
-    /**
-     * Returns this amount divided by the one specified.
-     *
-     * @param  that the amount divisor.
-     * @return <code>this / that</code>.
-     */
-    IMeasure<?> divide(IMeasure<?> that);
-    
-    IMeasure<? extends IMeasure<Q>> inverse();
-    
-    /**
-     * Returns this measurement converted into another unit.
-     * 
-     * @param unit
-     * @return the converted result.
-     */
-    IMeasure<Q> to(Unit<Q> unit);
-    
-    /**
-     * Returns the value of this quantity as <code>double</code> stated
-     * in the specified unit. This method is recommended over <code>
-     * q.getUnit().getConverterTo(unit).convert(q.getValue()).doubleValue()</code>
-     *
-     * @param unit the unit in which the returned value is stated.
-     * @return the value of this quantity when stated in the specified unit.
-     */
-    public double doubleValue(Unit<Q> unit);
-    
-    /**
-     * Returns the value of this quantity as <code>long</code> stated
-     * in the specified unit. This method is recommended over <code>
-     * q.getUnit().getConverterTo(unit).convert(q.getValue()).longValue()</code>
-     *
-     * @param unit the unit in which the returned value is stated.
-     * @return the value of this quantity when stated in the specified unit.
-     */
-    public long longValue(Unit<Q> unit);
-}
+/**
+ * Copyright (c) 2005, 2012, Werner Keil, JScience and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.units;
+
+import org.unitsofmeasurement.quantity.Quantity;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * <p> This interface represents the IMeasure, countable, or comparable 
+ *     property or aspect of a thing.</p>
+ *     
+ * <p> Implementing instances are typically the result of a measurement:[code]
+ *         IMeasure<Mass> weight = BaseAmount.valueOf(180.0, POUND);
+ *     [/code]
+ *     They can also be created from custom classes:[code]
+ *     class Delay implements IMeasure<Duration> {
+ *          private long nanoSeconds; // Implicit internal unit.
+ *          public double doubleValue(Unit<Velocity> unit) { ... }
+ *          public long longValue(Unit<Velocity> unit) { ... }
+ *     }
+ *     Thread.wait(new Delay(24, HOUR)); // Assuming Thread.wait(IMeasure<Duration>) method.
+ *     [/code]</p>
+ *     
+ * <p> Although IMeasure instances are for the most part scalar quantities; 
+ *     more complex implementations (e.g. vectors, data set) are allowed as 
+ *     long as an aggregate magnitude can be determined. For example:[code]
+ *     class Velocity3D implements IMeasure<Velocity> {
+ *          private double x, y, z; // Meter per seconds.
+ *          public double doubleValue(Unit<Velocity> unit) { ... } // Returns vector norm.
+ *          ... 
+ *     }
+ *     class Sensors<Q extends Quantity> extends QuantityAmount<double[], Q> {
+ *          public doubleValue(Unit<Q> unit) { ... } // Returns median value. 
+ *          ...
+ *     } [/code]</p>
+ * 
+ * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 0.4.2, $Date: 2014-08-03 $
+ * @param <Q>
+ */
+public interface IMeasure<Q extends Quantity<Q>> extends Quantity<Q> {    
+        
+    /**
+     * Returns the sum of this amount with the one specified.
+     *
+     * @param  that the amount to be added.
+     * @return <code>this + that</code>.
+     */
+    IMeasure<Q> add(IMeasure<Q> that);
+    
+    /**
+     * Returns the difference between this amount and the one specified.
+     *
+     * @param  that the number to be subtracted.
+     * @return <code>this - that</code>.
+     */
+    IMeasure<Q> subtract(IMeasure<Q> that);
+    
+    /**
+     * Returns the product of this amount with the one specified.
+     *
+     * @param  that the amount multiplier.
+     * @return <code>this · that</code>.
+     */
+    IMeasure<?> multiply(IMeasure<?> that);
+    
+    /**
+     * Returns the product of this amount with the number specified.
+     *
+     * @param  that the number multiplier.
+     * @return <code>this · that</code>.
+     */
+    IMeasure<?> multiply(Number that);
+    
+    /**
+     * Returns this amount divided by the one specified.
+     *
+     * @param  that the amount divisor.
+     * @return <code>this / that</code>.
+     */
+    IMeasure<?> divide(IMeasure<?> that);
+    
+    IMeasure<? extends IMeasure<Q>> inverse();
+    
+    /**
+     * Returns this measurement converted into another unit.
+     * 
+     * @param unit
+     * @return the converted result.
+     */
+    IMeasure<Q> to(Unit<Q> unit);
+    
+    /**
+     * Returns the value of this quantity as <code>double</code> stated
+     * in the specified unit. This method is recommended over <code>
+     * q.getUnit().getConverterTo(unit).convert(q.getValue()).doubleValue()</code>
+     *
+     * @param unit the unit in which the returned value is stated.
+     * @return the value of this quantity when stated in the specified unit.
+     */
+    public double doubleValue(Unit<Q> unit);
+    
+    /**
+     * Returns the value of this quantity as <code>long</code> stated
+     * in the specified unit. This method is recommended over <code>
+     * q.getUnit().getConverterTo(unit).convert(q.getValue()).longValue()</code>
+     *
+     * @param unit the unit in which the returned value is stated.
+     * @return the value of this quantity when stated in the specified unit.
+     */
+    public long longValue(Unit<Q> unit);
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/IState.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/IState.java
index e2ac49f..d04aa38 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/IState.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/IState.java
@@ -1,28 +1,28 @@
-/**
- * Copyright (c) 2005, 2011, Werner Keil, JScience and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.units;
-
-import org.eclipse.uomo.core.IName;
-import org.unitsofmeasurement.quantity.Quantity;
-import org.unitsofmeasurement.quantity.Time;
-
-/**
- * Groups a state name, value and timestamp.
- * The state itself is represented as a <type>Number</type> and the time is measured in IMeasure<Time>
- * A State object is immutable so that it may be easily shared.
- * 
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.1, $Date: 2011-04-07 02:02:02 +0430 $
- */
-public interface IState<Q extends Quantity<Q>> extends IName {
-	IMeasure<Time> time();
-	IMeasure<Q> value(); // TODO get* vs. getter-less, also avoid value().value()
-}
+/**
+ * Copyright (c) 2005, 2011, Werner Keil, JScience and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.units;
+
+import org.eclipse.uomo.core.IName;
+import org.unitsofmeasurement.quantity.Quantity;
+import org.unitsofmeasurement.quantity.Time;
+
+/**
+ * Groups a state name, value and timestamp.
+ * The state itself is represented as a <type>Number</type> and the time is measured in IMeasure<Time>
+ * A State object is immutable so that it may be easily shared.
+ * 
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.1, $Date: 2011-04-07 02:02:02 +0430 $
+ */
+public interface IState<Q extends Quantity<Q>> extends IName {
+	IMeasure<Time> time();
+	IMeasure<Q> value(); // TODO get* vs. getter-less, also avoid value().value()
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/BaseAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/BaseAmount.java
index 14aaa0f..a254035 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/BaseAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/BaseAmount.java
@@ -1,324 +1,324 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.units.impl;
-
-import static org.eclipse.uomo.core.impl.OutputHelper.println;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.math.MathContext;
-
-import org.eclipse.uomo.units.AbstractConverter;
-import org.eclipse.uomo.units.AbstractQuantity;
-import org.eclipse.uomo.units.AbstractUnit;
-import org.eclipse.uomo.units.IMeasure;
-import org.eclipse.uomo.units.impl.converter.RationalConverter;
-import org.eclipse.uomo.units.internal.MeasureAmount;
-import org.unitsofmeasurement.quantity.Dimensionless;
-import org.unitsofmeasurement.quantity.Quantity;
-import org.unitsofmeasurement.unit.Unit;
-import org.unitsofmeasurement.unit.UnitConverter;
-
-import com.ibm.icu.util.Measure;
-import com.ibm.icu.util.MeasureUnit;
-
-/**
- * Represents a generic quantity amount.
- * 
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.3.3, $Date: 2013-05-21 $
- * @deprecated use BaseQuantity
- */
-public class BaseAmount<Q extends Quantity<Q>> extends AbstractQuantity<Q>
-		implements Comparable<BaseAmount<Q>> {
-	
-	private final Measure measure;
-	
-	/**
-	 * @param number
-	 * @param unit
-	 */
-	public BaseAmount(Number number, Unit<Q> unit) {
-		super(unit);
-		measure = MeasureAmount.of(number,  (MeasureUnit)unit);
-		//super(number, (MeasureUnit) unit);
-	}
-
-	/**
-	 * Returns the amount corresponding to the specified value and unit.
-	 * 
-	 * @param value
-	 *            the value stated in the specified unit.
-	 * @param unit
-	 *            the unit in which the value is stated.
-	 * @return the corresponding amount.
-	 */
-	public static <Q extends Quantity<Q>> BaseAmount<Q> valueOf(Number value,
-			Unit<Q> unit) {
-		BaseAmount<Q> amount = new BaseAmount<Q>(value, unit);
-		return amount;
-	}
-
-	/**
-	 * Holds a dimensionless measure of one (exact).
-	 */
-	protected static final BaseAmount<Dimensionless> ONE = new BaseAmount<Dimensionless>(
-			BigDecimal.ONE, AbstractUnit.ONE);
-
-	@SuppressWarnings({ "rawtypes", "unchecked" })
-	public BaseAmount<Q> add(IMeasure<Q> that) {
-		final IMeasure<Q> thatToUnit = that.to(unit());
-		return new BaseAmount(this.value().doubleValue()
-				+ thatToUnit.value().doubleValue(), unit());
-	}
-
-	@SuppressWarnings({ "rawtypes", "unchecked" })
-	@Override
-	public BaseAmount<Q> subtract(IMeasure<Q> that) {
-		final IMeasure<Q> thatToUnit = that.to(unit());
-		return new BaseAmount(this.value().doubleValue()
-				- thatToUnit.value().doubleValue(), unit());
-
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	public BaseAmount<Q> multiply(IMeasure<?> that) {
-		Unit<?> unit = unit().multiply(that.unit());
-		return (BaseAmount<Q>) valueOf((value().doubleValue() * that.value()
-				.doubleValue()), unit);
-	}
-	
-	@Override
-	public BaseAmount<?> multiply(Number that) {
-		return (BaseAmount<Q>) valueOf((value().doubleValue() * that
-				.doubleValue()), unit());	
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	public BaseAmount<Q> divide(IMeasure<?> that) {
-		Unit<?> unit = unit().divide(that.unit());
-		return (BaseAmount<Q>) valueOf((value().doubleValue() / that.value()
-				.doubleValue()), unit);
-	}
-
-	@Override
-	public BaseAmount<Q> to(Unit<Q> unit) {
-		return to(unit, MathContext.DECIMAL128);
-	}
-
-	public BaseAmount<Q> to(Unit<Q> unit, MathContext ctx) {
-		if (this.unit().equals(unit))
-			return this;
-		UnitConverter cvtr = this.unit().getConverterTo(unit);
-		if (cvtr == AbstractConverter.IDENTITY)
-			return (BaseAmount<Q>) valueOf(this.value(), unit);
-		return (BaseAmount<Q>) valueOf(convert(this.value(), cvtr, ctx), unit);
-	}
-
-	// Try to convert the specified value.
-	private static Number convert(Number value, UnitConverter cvtr,
-			MathContext ctx) {
-		if (cvtr instanceof RationalConverter) { // Try converting through Field
-													// methods.
-			RationalConverter rCvtr = (RationalConverter) cvtr;
-			BigInteger dividend = rCvtr.getDividend();
-			BigInteger divisor = rCvtr.getDivisor();
-			if (dividend.abs().compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0)
-				throw new ArithmeticException("Multiplier overflow"); //$NON-NLS-1$
-			if (divisor.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0)
-				throw new ArithmeticException("Divisor overflow"); //$NON-NLS-1$
-			if (value instanceof BigInteger || value instanceof Long || value instanceof Integer) {
-				return (value.longValue() * dividend.longValue())
-					/ (divisor.longValue());
-			} else {
-				return (value.doubleValue() * dividend.doubleValue())
-					/ (divisor.doubleValue());
-				// TODO use actual BigDecimal methods for BigDecimal
-			}
-		} else if (cvtr instanceof AbstractConverter.Compound
-				&& cvtr.isLinear()) { // Do it in two parts.
-			AbstractConverter.Compound compound = (AbstractConverter.Compound) cvtr;
-			Number firstConversion = convert(value, compound.getRight(), ctx);
-			Number secondConversion = convert(firstConversion,
-					compound.getLeft(), ctx);
-			return secondConversion;
-		} else { // Try using BigDecimal as intermediate.
-			BigDecimal decimalValue = BigDecimal.valueOf(value.doubleValue());
-			BigDecimal newValue = cvtr.convert(decimalValue, ctx);
-			return newValue;
-			// if (((FieldNumber)value) instanceof Decimal)
-			// return (N)((FieldNumber)Decimal.valueOf(newValue));
-			// if (((FieldNumber)value) instanceof Float64)
-			// return (N)((FieldNumber)Float64.valueOf(newValue.doubleValue()));
-			// throw new ArithmeticException(
-			// "Generic amount conversion not implemented for amount of type " +
-			// value.getClass());
-		}
-	}
-
-	/**
-	 * Returns this measure raised at the specified exponent.
-	 * 
-	 * @param exp
-	 *            the exponent.
-	 * @return <code>this<sup>exp</sup></code>
-	 */
-	@SuppressWarnings("unchecked")
-	public IMeasure<? extends IMeasure<Q>> pow(int exp) {
-		if (exp < 0)
-			return (IMeasure<? extends IMeasure<Q>>) this.pow(-exp).inverse();
-		if (exp == 0)
-
-			return (IMeasure<? extends IMeasure<Q>>) ONE;
-
-		IMeasure<? extends IMeasure<Q>> pow2 = (IMeasure<? extends IMeasure<Q>>) this;
-		IMeasure<? extends IMeasure<Q>> result = null;
-		while (exp >= 1) { // Iteration.
-
-			if ((exp & 1) == 1) {
-				result = (IMeasure<? extends IMeasure<Q>>) ((result == null) ? pow2
-						: result.multiply(pow2));
-
-			}
-
-			pow2 = (IMeasure<? extends IMeasure<Q>>) pow2.multiply(pow2);
-
-			exp >>>= 1;
-
-		}
-
-		return result;
-
-	}
-
-	public IMeasure<? extends IMeasure<Q>> inverse() {
-		@SuppressWarnings({ "rawtypes", "unchecked" })
-		final IMeasure<? extends IMeasure<Q>> m = new BaseAmount(value(),
-				unit().inverse());
-		return m;
-	}
-
-	@Override
-	public int compareTo(BaseAmount<Q> o) {
-		// TODO Auto-generated method stub
-		return 0;
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (obj == null)
-			return false;
-		if (obj == this)
-			return true;
-		if (obj instanceof BaseAmount<?>) {
-			BaseAmount<?> ba = (BaseAmount<?>) obj;
-			if (this.unit().getClass() == ba.unit().getClass()) {
-				return super.equals(obj);
-			}
-			if (ba.unit() instanceof AlternateUnit<?>) {
-				AlternateUnit<?> baa = (AlternateUnit<?>) ba.unit();
-				if (this.unit() instanceof AlternateUnit<?>) {
-					return super.equals(obj);
-				} else if (this.unit() instanceof AnnotatedUnit<?>) {
-					AnnotatedUnit<?> au = (AnnotatedUnit<?>) this.unit();
-					println("Ann: " + au); //$NON-NLS-1$
-				} else if (this.unit() instanceof BaseUnit<?>) {
-					BaseUnit<?> bu = (BaseUnit<?>) this.unit();
-					println("Bas: " + bu); //$NON-NLS-1$
-				} else if (this.unit() instanceof ProductUnit<?>) {
-					ProductUnit<?> pu = (ProductUnit<?>) this.unit();
-					println("Pro: " + pu); //$NON-NLS-1$
-				} else if (this.unit() instanceof TransformedUnit<?>) {
-					TransformedUnit<?> tu = (TransformedUnit<?>) this.unit();
-					println("Tran: " + tu); //$NON-NLS-1$
-					if (tu.getParentUnit().equals(baa)) {
-						return true; // FIXME use number here, too
-					}
-				} else {
-					return super.equals(obj);
-				}
-			}
-			if (ba.unit() instanceof BaseUnit<?>) {
-				if (this.unit() instanceof AlternateUnit<?>) {
-					AlternateUnit<?> au = (AlternateUnit<?>) this.unit();
-					println("Alt: " + au); //$NON-NLS-1$
-				} else if (this.unit() instanceof AnnotatedUnit<?>) {
-					AnnotatedUnit<?> au = (AnnotatedUnit<?>) this.unit();
-					println("Ann: " + au); //$NON-NLS-1$
-				} else if (this.unit() instanceof BaseUnit<?>) {
-					return super.equals(obj);
-				} else if (this.unit() instanceof ProductUnit<?>) {
-					ProductUnit<?> pu = (ProductUnit<?>) this.unit();
-					println("Pro: " + pu); //$NON-NLS-1$
-				} else if (this.unit() instanceof TransformedUnit<?>) {
-					TransformedUnit<?> tu = (TransformedUnit<?>) this.unit();
-					println("Tran: " + tu); //$NON-NLS-1$
-				} else {
-					return super.equals(obj);
-				}
-			}
-			if (ba.unit() instanceof TransformedUnit<?>) {
-				TransformedUnit<?> bat = (TransformedUnit<?>) ba.unit();
-				if (this.unit() instanceof AlternateUnit<?>) {
-					AlternateUnit<?> au = (AlternateUnit<?>) this.unit();
-					println("Alt: " + au); //$NON-NLS-1$
-					if (bat.getParentUnit().equals(au)) {
-						return true;
-					}
-				} else if (this.unit() instanceof AnnotatedUnit<?>) {
-					AnnotatedUnit<?> au = (AnnotatedUnit<?>) this.unit();
-					System.out.println("Ann: " + au); //$NON-NLS-1$
-				} else if (this.unit() instanceof BaseUnit<?>) {
-					BaseUnit<?> bu = (BaseUnit<?>) this.unit();
-					println("Bas: " + bu); //$NON-NLS-1$
-				} else if (this.unit() instanceof ProductUnit<?>) {
-					ProductUnit<?> pu = (ProductUnit<?>) this.unit();
-					println("Pro: " + pu); //$NON-NLS-1$
-				} else if (this.unit() instanceof TransformedUnit<?>) {
-					return super.equals(obj);
-				} else {
-					return super.equals(obj);
-				}
-			}
-		}
-		return super.equals(obj);
-	}
-
-	@Override
-	public Number value() {
-		return measure.getNumber();
-	}
-
-	@Override
-	public Number getValue() {
-		return value();
-	}
-
-	@Override
-	public boolean isBig() {
-		return value() instanceof BigDecimal;
-	}
-
-	@Override
-	public BigDecimal decimalValue(Unit<Q> unit, MathContext ctx)
-			throws ArithmeticException {
-		   BigDecimal decimal = (value() instanceof BigDecimal) ? (BigDecimal)value() : BigDecimal.valueOf(value().doubleValue()); // TODO check value if it is a BD, otherwise use different converter
-           return (unit().equals(unit)) ? decimal : ((AbstractConverter)unit().getConverterTo(unit)).convert(decimal, ctx);
-
-	}
-
-	@Override
-	public double doubleValue(Unit<Q> unit) throws ArithmeticException {
-		return (unit().equals(unit)) ? value().doubleValue() : unit().getConverterTo(unit).convert(value().doubleValue());
-	}
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl;
+
+import static org.eclipse.uomo.core.impl.OutputHelper.println;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.math.MathContext;
+
+import org.eclipse.uomo.units.AbstractConverter;
+import org.eclipse.uomo.units.AbstractQuantity;
+import org.eclipse.uomo.units.AbstractUnit;
+import org.eclipse.uomo.units.IMeasure;
+import org.eclipse.uomo.units.impl.converter.RationalConverter;
+import org.eclipse.uomo.units.internal.MeasureAmount;
+import org.unitsofmeasurement.quantity.Dimensionless;
+import org.unitsofmeasurement.quantity.Quantity;
+import org.unitsofmeasurement.unit.Unit;
+import org.unitsofmeasurement.unit.UnitConverter;
+
+import com.ibm.icu.util.Measure;
+import com.ibm.icu.util.MeasureUnit;
+
+/**
+ * Represents a generic quantity amount.
+ * 
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.3.3, $Date: 2013-05-21 $
+ * @deprecated use BaseQuantity
+ */
+public class BaseAmount<Q extends Quantity<Q>> extends AbstractQuantity<Q>
+		implements Comparable<BaseAmount<Q>> {
+	
+	private final Measure measure;
+	
+	/**
+	 * @param number
+	 * @param unit
+	 */
+	public BaseAmount(Number number, Unit<Q> unit) {
+		super(unit);
+		measure = MeasureAmount.of(number,  (MeasureUnit)unit);
+		//super(number, (MeasureUnit) unit);
+	}
+
+	/**
+	 * Returns the amount corresponding to the specified value and unit.
+	 * 
+	 * @param value
+	 *            the value stated in the specified unit.
+	 * @param unit
+	 *            the unit in which the value is stated.
+	 * @return the corresponding amount.
+	 */
+	public static <Q extends Quantity<Q>> BaseAmount<Q> valueOf(Number value,
+			Unit<Q> unit) {
+		BaseAmount<Q> amount = new BaseAmount<Q>(value, unit);
+		return amount;
+	}
+
+	/**
+	 * Holds a dimensionless measure of one (exact).
+	 */
+	protected static final BaseAmount<Dimensionless> ONE = new BaseAmount<Dimensionless>(
+			BigDecimal.ONE, AbstractUnit.ONE);
+
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	public BaseAmount<Q> add(IMeasure<Q> that) {
+		final IMeasure<Q> thatToUnit = that.to(unit());
+		return new BaseAmount(this.value().doubleValue()
+				+ thatToUnit.value().doubleValue(), unit());
+	}
+
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	@Override
+	public BaseAmount<Q> subtract(IMeasure<Q> that) {
+		final IMeasure<Q> thatToUnit = that.to(unit());
+		return new BaseAmount(this.value().doubleValue()
+				- thatToUnit.value().doubleValue(), unit());
+
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public BaseAmount<Q> multiply(IMeasure<?> that) {
+		Unit<?> unit = unit().multiply(that.unit());
+		return (BaseAmount<Q>) valueOf((value().doubleValue() * that.value()
+				.doubleValue()), unit);
+	}
+	
+	@Override
+	public BaseAmount<?> multiply(Number that) {
+		return (BaseAmount<Q>) valueOf((value().doubleValue() * that
+				.doubleValue()), unit());	
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public BaseAmount<Q> divide(IMeasure<?> that) {
+		Unit<?> unit = unit().divide(that.unit());
+		return (BaseAmount<Q>) valueOf((value().doubleValue() / that.value()
+				.doubleValue()), unit);
+	}
+
+	@Override
+	public BaseAmount<Q> to(Unit<Q> unit) {
+		return to(unit, MathContext.DECIMAL128);
+	}
+
+	public BaseAmount<Q> to(Unit<Q> unit, MathContext ctx) {
+		if (this.unit().equals(unit))
+			return this;
+		UnitConverter cvtr = this.unit().getConverterTo(unit);
+		if (cvtr == AbstractConverter.IDENTITY)
+			return (BaseAmount<Q>) valueOf(this.value(), unit);
+		return (BaseAmount<Q>) valueOf(convert(this.value(), cvtr, ctx), unit);
+	}
+
+	// Try to convert the specified value.
+	private static Number convert(Number value, UnitConverter cvtr,
+			MathContext ctx) {
+		if (cvtr instanceof RationalConverter) { // Try converting through Field
+													// methods.
+			RationalConverter rCvtr = (RationalConverter) cvtr;
+			BigInteger dividend = rCvtr.getDividend();
+			BigInteger divisor = rCvtr.getDivisor();
+			if (dividend.abs().compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0)
+				throw new ArithmeticException("Multiplier overflow"); //$NON-NLS-1$
+			if (divisor.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0)
+				throw new ArithmeticException("Divisor overflow"); //$NON-NLS-1$
+			if (value instanceof BigInteger || value instanceof Long || value instanceof Integer) {
+				return (value.longValue() * dividend.longValue())
+					/ (divisor.longValue());
+			} else {
+				return (value.doubleValue() * dividend.doubleValue())
+					/ (divisor.doubleValue());
+				// TODO use actual BigDecimal methods for BigDecimal
+			}
+		} else if (cvtr instanceof AbstractConverter.Compound
+				&& cvtr.isLinear()) { // Do it in two parts.
+			AbstractConverter.Compound compound = (AbstractConverter.Compound) cvtr;
+			Number firstConversion = convert(value, compound.getRight(), ctx);
+			Number secondConversion = convert(firstConversion,
+					compound.getLeft(), ctx);
+			return secondConversion;
+		} else { // Try using BigDecimal as intermediate.
+			BigDecimal decimalValue = BigDecimal.valueOf(value.doubleValue());
+			BigDecimal newValue = cvtr.convert(decimalValue, ctx);
+			return newValue;
+			// if (((FieldNumber)value) instanceof Decimal)
+			// return (N)((FieldNumber)Decimal.valueOf(newValue));
+			// if (((FieldNumber)value) instanceof Float64)
+			// return (N)((FieldNumber)Float64.valueOf(newValue.doubleValue()));
+			// throw new ArithmeticException(
+			// "Generic amount conversion not implemented for amount of type " +
+			// value.getClass());
+		}
+	}
+
+	/**
+	 * Returns this measure raised at the specified exponent.
+	 * 
+	 * @param exp
+	 *            the exponent.
+	 * @return <code>this<sup>exp</sup></code>
+	 */
+	@SuppressWarnings("unchecked")
+	public IMeasure<? extends IMeasure<Q>> pow(int exp) {
+		if (exp < 0)
+			return (IMeasure<? extends IMeasure<Q>>) this.pow(-exp).inverse();
+		if (exp == 0)
+
+			return (IMeasure<? extends IMeasure<Q>>) ONE;
+
+		IMeasure<? extends IMeasure<Q>> pow2 = (IMeasure<? extends IMeasure<Q>>) this;
+		IMeasure<? extends IMeasure<Q>> result = null;
+		while (exp >= 1) { // Iteration.
+
+			if ((exp & 1) == 1) {
+				result = (IMeasure<? extends IMeasure<Q>>) ((result == null) ? pow2
+						: result.multiply(pow2));
+
+			}
+
+			pow2 = (IMeasure<? extends IMeasure<Q>>) pow2.multiply(pow2);
+
+			exp >>>= 1;
+
+		}
+
+		return result;
+
+	}
+
+	public IMeasure<? extends IMeasure<Q>> inverse() {
+		@SuppressWarnings({ "rawtypes", "unchecked" })
+		final IMeasure<? extends IMeasure<Q>> m = new BaseAmount(value(),
+				unit().inverse());
+		return m;
+	}
+
+	@Override
+	public int compareTo(BaseAmount<Q> o) {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (obj == null)
+			return false;
+		if (obj == this)
+			return true;
+		if (obj instanceof BaseAmount<?>) {
+			BaseAmount<?> ba = (BaseAmount<?>) obj;
+			if (this.unit().getClass() == ba.unit().getClass()) {
+				return super.equals(obj);
+			}
+			if (ba.unit() instanceof AlternateUnit<?>) {
+				AlternateUnit<?> baa = (AlternateUnit<?>) ba.unit();
+				if (this.unit() instanceof AlternateUnit<?>) {
+					return super.equals(obj);
+				} else if (this.unit() instanceof AnnotatedUnit<?>) {
+					AnnotatedUnit<?> au = (AnnotatedUnit<?>) this.unit();
+					println("Ann: " + au); //$NON-NLS-1$
+				} else if (this.unit() instanceof BaseUnit<?>) {
+					BaseUnit<?> bu = (BaseUnit<?>) this.unit();
+					println("Bas: " + bu); //$NON-NLS-1$
+				} else if (this.unit() instanceof ProductUnit<?>) {
+					ProductUnit<?> pu = (ProductUnit<?>) this.unit();
+					println("Pro: " + pu); //$NON-NLS-1$
+				} else if (this.unit() instanceof TransformedUnit<?>) {
+					TransformedUnit<?> tu = (TransformedUnit<?>) this.unit();
+					println("Tran: " + tu); //$NON-NLS-1$
+					if (tu.getParentUnit().equals(baa)) {
+						return true; // FIXME use number here, too
+					}
+				} else {
+					return super.equals(obj);
+				}
+			}
+			if (ba.unit() instanceof BaseUnit<?>) {
+				if (this.unit() instanceof AlternateUnit<?>) {
+					AlternateUnit<?> au = (AlternateUnit<?>) this.unit();
+					println("Alt: " + au); //$NON-NLS-1$
+				} else if (this.unit() instanceof AnnotatedUnit<?>) {
+					AnnotatedUnit<?> au = (AnnotatedUnit<?>) this.unit();
+					println("Ann: " + au); //$NON-NLS-1$
+				} else if (this.unit() instanceof BaseUnit<?>) {
+					return super.equals(obj);
+				} else if (this.unit() instanceof ProductUnit<?>) {
+					ProductUnit<?> pu = (ProductUnit<?>) this.unit();
+					println("Pro: " + pu); //$NON-NLS-1$
+				} else if (this.unit() instanceof TransformedUnit<?>) {
+					TransformedUnit<?> tu = (TransformedUnit<?>) this.unit();
+					println("Tran: " + tu); //$NON-NLS-1$
+				} else {
+					return super.equals(obj);
+				}
+			}
+			if (ba.unit() instanceof TransformedUnit<?>) {
+				TransformedUnit<?> bat = (TransformedUnit<?>) ba.unit();
+				if (this.unit() instanceof AlternateUnit<?>) {
+					AlternateUnit<?> au = (AlternateUnit<?>) this.unit();
+					println("Alt: " + au); //$NON-NLS-1$
+					if (bat.getParentUnit().equals(au)) {
+						return true;
+					}
+				} else if (this.unit() instanceof AnnotatedUnit<?>) {
+					AnnotatedUnit<?> au = (AnnotatedUnit<?>) this.unit();
+					System.out.println("Ann: " + au); //$NON-NLS-1$
+				} else if (this.unit() instanceof BaseUnit<?>) {
+					BaseUnit<?> bu = (BaseUnit<?>) this.unit();
+					println("Bas: " + bu); //$NON-NLS-1$
+				} else if (this.unit() instanceof ProductUnit<?>) {
+					ProductUnit<?> pu = (ProductUnit<?>) this.unit();
+					println("Pro: " + pu); //$NON-NLS-1$
+				} else if (this.unit() instanceof TransformedUnit<?>) {
+					return super.equals(obj);
+				} else {
+					return super.equals(obj);
+				}
+			}
+		}
+		return super.equals(obj);
+	}
+
+	@Override
+	public Number value() {
+		return measure.getNumber();
+	}
+
+	@Override
+	public Number getValue() {
+		return value();
+	}
+
+	@Override
+	public boolean isBig() {
+		return value() instanceof BigDecimal;
+	}
+
+	@Override
+	public BigDecimal decimalValue(Unit<Q> unit, MathContext ctx)
+			throws ArithmeticException {
+		   BigDecimal decimal = (value() instanceof BigDecimal) ? (BigDecimal)value() : BigDecimal.valueOf(value().doubleValue()); // TODO check value if it is a BD, otherwise use different converter
+           return (unit().equals(unit)) ? decimal : ((AbstractConverter)unit().getConverterTo(unit)).convert(decimal, ctx);
+
+	}
+
+	@Override
+	public double doubleValue(Unit<Q> unit) throws ArithmeticException {
+		return (unit().equals(unit)) ? value().doubleValue() : unit().getConverterTo(unit).convert(value().doubleValue());
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/BaseQuantity.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/BaseQuantity.java
index 6eb4306..153e018 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/BaseQuantity.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/BaseQuantity.java
@@ -1,292 +1,292 @@
-/**
- *  Unit-API - Units of Measurement API for Java
- *  Copyright 2013-2014, Jean-Marie Dautelle, Werner Keil, V2COM and individual
- *  contributors by the @author tag.
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *  http://www.apache.org/licenses/LICENSE-2.0
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.eclipse.uomo.units.impl;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.math.MathContext;
-
-import org.eclipse.uomo.units.AbstractConverter;
-import org.eclipse.uomo.units.AbstractQuantity;
-import org.eclipse.uomo.units.IMeasure;
-import org.unitsofmeasurement.quantity.Quantity;
-import org.unitsofmeasurement.unit.IncommensurableException;
-import org.unitsofmeasurement.unit.UnconvertibleException;
-import org.unitsofmeasurement.unit.Unit;
-import org.unitsofmeasurement.unit.UnitConverter;
-
-/**
- * An amount of quantity, consisting of a Number and a Unit. BaseMeasurement
- * objects are immutable.
- * 
- * @see java.lang.Number
- * @see MeasureUnit
- * @author <a href="mailto:units@catmedia.us">Werner Keil</a>
- * @param <Q>
- *            The type of the quantity.
- * @version 1.6, $Date: 2014-04-08 $
- */
-public class BaseQuantity<Q extends Quantity<Q>> extends AbstractQuantity<Q>
-		implements Quantity<Q>, Comparable<BaseQuantity<Q>> {
-//FIXME Bug 338334 overwrite equals()
-    
-
-	/**
-	 * 
-	 */
-//	private static final long serialVersionUID = 7312161895652321241L;
-
-	private final Number value;
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractMeasurement#equals(java.lang.Object)
-	 */
-	@Override
-	public boolean equals(Object obj) {
-		if (obj == null)
-			return false;
-		if (obj == this)
-			return true;
-		if (this.getClass() == obj.getClass()) {
-			return super.equals(obj);
-		} else {
-			if (obj instanceof Quantity) {
-				@SuppressWarnings("rawtypes")
-				Quantity m = (Quantity) obj;
-				if (m.value().getClass() == this.getValue().getClass()
-						&& m.unit().getClass() == this.getUnit().getClass()) {
-					return super.equals(obj);
-				} else {
-					// if (this.getQuantityUnit() instanceof AbstractUnit<?>) {
-					// if
-					// }
-					return super.equals(obj);
-				}
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * Indicates if this measure is exact.
-	 */
-	private final boolean isExact;
-
-	/**
-	 * Indicates if this measure is big.
-	 */
-	private final boolean isBig;
-	
-	/**
-	 * Holds the exact value (when exact) stated in this measure unit.
-	 */
-	// private long exactValue;
-
-	/**
-	 * Holds the minimum value stated in this measure unit. For inexact
-	 * measures: minimum < maximum
-	 */
-	// private double minimum;
-
-	/**
-	 * Holds the maximum value stated in this measure unit. For inexact
-	 * measures: maximum > minimum
-	 */
-	// private double maximum;
-
-	protected BaseQuantity(Number number, Unit<Q> unit) {
-		super(unit);
-		value = number;
-		isExact = false;
-		isBig = false;;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * Measurement#doubleValue(javax.measure.Unit)
-	 */
-	public double doubleValue(Unit<Q> unit) {
-		Unit<Q> myUnit = getUnit();
-		try {
-			UnitConverter converter = unit.getConverterTo(myUnit);
-			return converter.convert(getValue().doubleValue());
-		} catch (UnconvertibleException e) {
-			throw e;
-		} // catch (IncommensurableException e) {
-		// throw new IllegalArgumentException(e.getMessage());
-		// }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.uomo.units.AbstractMeasurement#longValue(javax.measure
-	 * .Unit)
-	 */
-	public long longValue(Unit<Q> unit) {
-		Unit<Q> myUnit = getUnit();
-		try {
-			UnitConverter converter = unit.getConverterToAny(myUnit);
-			if ((getValue() instanceof BigDecimal || getValue() instanceof BigInteger) 
-					&& converter instanceof AbstractConverter) {
-				return (((AbstractConverter)converter).convert(
-						BigDecimal.valueOf(getValue().longValue()),
-						MathContext.DECIMAL128)).longValue();
-			} else {
-		        double result = doubleValue(unit);
-		        if ((result < Long.MIN_VALUE) || (result > Long.MAX_VALUE)) {
-		            throw new ArithmeticException("Overflow (" + result + ")");
-		        }
-		        return (long) result;
-			}
-		} catch (UnconvertibleException e) {
-			throw e;
-		} catch (IncommensurableException e) {
-			throw new IllegalArgumentException(e.getMessage());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see javax.measure.Quantity#getValue()
-	 */
-	public Number getValue() {
-		return value;
-	}
-
-	/**
-	 * Indicates if this measured amount is exact. An exact amount is guarantee
-	 * exact only when stated in this measure unit (e.g.
-	 * <code>this.longValue()</code>); stating the amount in any other unit may
-	 * introduce conversion errors.
-	 * 
-	 * @return <code>true</code> if this measure is exact; <code>false</code>
-	 *         otherwise.
-	 */
-	public boolean isExact() {
-		return isExact;
-	}
-	
-	/**
-	 * Indicates if this measured amount is a big number, i.E. BigDecimal or BigInteger.
-	 * In all other cases this would be false.
-	 * 
-	 * @return <code>true</code> if this measure is big; <code>false</code>
-	 *         otherwise.
-	 */
-	public boolean isBig() {
-		return isBig;
-	}
-	
-	@SuppressWarnings({ "rawtypes", "unchecked" })
-	public BaseQuantity<Q> add(AbstractQuantity<Q> that) {
-		final AbstractQuantity<Q> thatToUnit = that.to(getUnit());
-		return new BaseQuantity(this.getValue().doubleValue()
-				+ thatToUnit.getValue().doubleValue(), 
-                                  getUnit());
-	}
-	
-	public String toString() {
-		return  String.valueOf(getValue()) + " " 
-                        + String.valueOf(getUnit());
-	}
-
-	@Override
-	public IMeasure<Q> add(IMeasure<Q> that) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public IMeasure<Q> subtract(IMeasure<Q> that) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public IMeasure<?> multiply(IMeasure<?> that) {
-		final Unit<?> unit = getUnit().multiply(that.unit());
-		return of((getValue().doubleValue() * that.value()
-				.doubleValue()), unit);	
-	}
-        
-        @Override
-	public BaseQuantity<?> multiply(Number that) {
-		return (BaseQuantity<Q>) of((getValue().doubleValue() * that
-				.doubleValue()), getUnit());	
-	}
-        
-	@Override
-	public IMeasure<?> divide(IMeasure<?> that) {
-		final Unit<?> unit = getUnit().divide(that.unit());
-		return of((getValue().doubleValue() / that.value()
-				.doubleValue()), unit);	
-	}
-
-	public IMeasure<?> divide(Number that) {
-		// TODO may use isBig() here, too
-		if (value instanceof BigDecimal && that instanceof BigDecimal) {
-			return of(((BigDecimal)value).divide((BigDecimal)that), 
-                                getUnit());
-		}
-		return of(getValue().doubleValue() / that.doubleValue(), 
-                        getUnit());	
-	}
-	
-//	@Override
-//	public IMeasure<Q> inverse() {
-//		@SuppressWarnings({ "rawtypes", "unchecked" })
-//		final IMeasure<Q> m = new BaseQuantity(getValue(),
-//				getUnit().inverse()); // TODO keep value same?
-//		return m;
-//	}
-
-	@Override
-	public BigDecimal decimalValue(Unit<Q> unit, MathContext ctx)
-			throws ArithmeticException {
-		if (value instanceof BigDecimal) {
-                    return (BigDecimal)value;
-                }
-                if (value instanceof BigInteger) {
-                    return new BigDecimal((BigInteger)value);
-                }
-		return BigDecimal.valueOf(value.doubleValue());
-	}
-
-	@Override
-	public int compareTo(BaseQuantity<Q> o) {
-		// TODO Auto-generated method stub
-		return 0;
-	}
-
-	@Override
-	public Number value() {
-		return getValue();
-	}
-
-	@Override
-	public IMeasure<? extends IMeasure<Q>> inverse() {
-		final IMeasure<? extends IMeasure<Q>> m = new BaseQuantity(getValue(),
-		getUnit().inverse()); // TODO keep value same?
-		return m;
-	}
-}
+/**
+ *  Unit-API - Units of Measurement API for Java
+ *  Copyright 2013-2014, Jean-Marie Dautelle, Werner Keil, V2COM and individual
+ *  contributors by the @author tag.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.eclipse.uomo.units.impl;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.math.MathContext;
+
+import org.eclipse.uomo.units.AbstractConverter;
+import org.eclipse.uomo.units.AbstractQuantity;
+import org.eclipse.uomo.units.IMeasure;
+import org.unitsofmeasurement.quantity.Quantity;
+import org.unitsofmeasurement.unit.IncommensurableException;
+import org.unitsofmeasurement.unit.UnconvertibleException;
+import org.unitsofmeasurement.unit.Unit;
+import org.unitsofmeasurement.unit.UnitConverter;
+
+/**
+ * An amount of quantity, consisting of a Number and a Unit. BaseMeasurement
+ * objects are immutable.
+ * 
+ * @see java.lang.Number
+ * @see MeasureUnit
+ * @author <a href="mailto:units@catmedia.us">Werner Keil</a>
+ * @param <Q>
+ *            The type of the quantity.
+ * @version 1.6, $Date: 2014-04-08 $
+ */
+public class BaseQuantity<Q extends Quantity<Q>> extends AbstractQuantity<Q>
+		implements Quantity<Q>, Comparable<BaseQuantity<Q>> {
+//FIXME Bug 338334 overwrite equals()
+    
+
+	/**
+	 * 
+	 */
+//	private static final long serialVersionUID = 7312161895652321241L;
+
+	private final Number value;
+	
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see AbstractMeasurement#equals(java.lang.Object)
+	 */
+	@Override
+	public boolean equals(Object obj) {
+		if (obj == null)
+			return false;
+		if (obj == this)
+			return true;
+		if (this.getClass() == obj.getClass()) {
+			return super.equals(obj);
+		} else {
+			if (obj instanceof Quantity) {
+				@SuppressWarnings("rawtypes")
+				Quantity m = (Quantity) obj;
+				if (m.value().getClass() == this.getValue().getClass()
+						&& m.unit().getClass() == this.getUnit().getClass()) {
+					return super.equals(obj);
+				} else {
+					// if (this.getQuantityUnit() instanceof AbstractUnit<?>) {
+					// if
+					// }
+					return super.equals(obj);
+				}
+			}
+			return false;
+		}
+	}
+
+	/**
+	 * Indicates if this measure is exact.
+	 */
+	private final boolean isExact;
+
+	/**
+	 * Indicates if this measure is big.
+	 */
+	private final boolean isBig;
+	
+	/**
+	 * Holds the exact value (when exact) stated in this measure unit.
+	 */
+	// private long exactValue;
+
+	/**
+	 * Holds the minimum value stated in this measure unit. For inexact
+	 * measures: minimum < maximum
+	 */
+	// private double minimum;
+
+	/**
+	 * Holds the maximum value stated in this measure unit. For inexact
+	 * measures: maximum > minimum
+	 */
+	// private double maximum;
+
+	protected BaseQuantity(Number number, Unit<Q> unit) {
+		super(unit);
+		value = number;
+		isExact = false;
+		isBig = false;;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * Measurement#doubleValue(javax.measure.Unit)
+	 */
+	public double doubleValue(Unit<Q> unit) {
+		Unit<Q> myUnit = getUnit();
+		try {
+			UnitConverter converter = unit.getConverterTo(myUnit);
+			return converter.convert(getValue().doubleValue());
+		} catch (UnconvertibleException e) {
+			throw e;
+		} // catch (IncommensurableException e) {
+		// throw new IllegalArgumentException(e.getMessage());
+		// }
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.uomo.units.AbstractMeasurement#longValue(javax.measure
+	 * .Unit)
+	 */
+	public long longValue(Unit<Q> unit) {
+		Unit<Q> myUnit = getUnit();
+		try {
+			UnitConverter converter = unit.getConverterToAny(myUnit);
+			if ((getValue() instanceof BigDecimal || getValue() instanceof BigInteger) 
+					&& converter instanceof AbstractConverter) {
+				return (((AbstractConverter)converter).convert(
+						BigDecimal.valueOf(getValue().longValue()),
+						MathContext.DECIMAL128)).longValue();
+			} else {
+		        double result = doubleValue(unit);
+		        if ((result < Long.MIN_VALUE) || (result > Long.MAX_VALUE)) {
+		            throw new ArithmeticException("Overflow (" + result + ")");
+		        }
+		        return (long) result;
+			}
+		} catch (UnconvertibleException e) {
+			throw e;
+		} catch (IncommensurableException e) {
+			throw new IllegalArgumentException(e.getMessage());
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.measure.Quantity#getValue()
+	 */
+	public Number getValue() {
+		return value;
+	}
+
+	/**
+	 * Indicates if this measured amount is exact. An exact amount is guarantee
+	 * exact only when stated in this measure unit (e.g.
+	 * <code>this.longValue()</code>); stating the amount in any other unit may
+	 * introduce conversion errors.
+	 * 
+	 * @return <code>true</code> if this measure is exact; <code>false</code>
+	 *         otherwise.
+	 */
+	public boolean isExact() {
+		return isExact;
+	}
+	
+	/**
+	 * Indicates if this measured amount is a big number, i.E. BigDecimal or BigInteger.
+	 * In all other cases this would be false.
+	 * 
+	 * @return <code>true</code> if this measure is big; <code>false</code>
+	 *         otherwise.
+	 */
+	public boolean isBig() {
+		return isBig;
+	}
+	
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	public BaseQuantity<Q> add(AbstractQuantity<Q> that) {
+		final AbstractQuantity<Q> thatToUnit = that.to(getUnit());
+		return new BaseQuantity(this.getValue().doubleValue()
+				+ thatToUnit.getValue().doubleValue(), 
+                                  getUnit());
+	}
+	
+	public String toString() {
+		return  String.valueOf(getValue()) + " " 
+                        + String.valueOf(getUnit());
+	}
+
+	@Override
+	public IMeasure<Q> add(IMeasure<Q> that) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public IMeasure<Q> subtract(IMeasure<Q> that) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public IMeasure<?> multiply(IMeasure<?> that) {
+		final Unit<?> unit = getUnit().multiply(that.unit());
+		return of((getValue().doubleValue() * that.value()
+				.doubleValue()), unit);	
+	}
+        
+        @Override
+	public BaseQuantity<?> multiply(Number that) {
+		return (BaseQuantity<Q>) of((getValue().doubleValue() * that
+				.doubleValue()), getUnit());	
+	}
+        
+	@Override
+	public IMeasure<?> divide(IMeasure<?> that) {
+		final Unit<?> unit = getUnit().divide(that.unit());
+		return of((getValue().doubleValue() / that.value()
+				.doubleValue()), unit);	
+	}
+
+	public IMeasure<?> divide(Number that) {
+		// TODO may use isBig() here, too
+		if (value instanceof BigDecimal && that instanceof BigDecimal) {
+			return of(((BigDecimal)value).divide((BigDecimal)that), 
+                                getUnit());
+		}
+		return of(getValue().doubleValue() / that.doubleValue(), 
+                        getUnit());	
+	}
+	
+//	@Override
+//	public IMeasure<Q> inverse() {
+//		@SuppressWarnings({ "rawtypes", "unchecked" })
+//		final IMeasure<Q> m = new BaseQuantity(getValue(),
+//				getUnit().inverse()); // TODO keep value same?
+//		return m;
+//	}
+
+	@Override
+	public BigDecimal decimalValue(Unit<Q> unit, MathContext ctx)
+			throws ArithmeticException {
+		if (value instanceof BigDecimal) {
+                    return (BigDecimal)value;
+                }
+                if (value instanceof BigInteger) {
+                    return new BigDecimal((BigInteger)value);
+                }
+		return BigDecimal.valueOf(value.doubleValue());
+	}
+
+	@Override
+	public int compareTo(BaseQuantity<Q> o) {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public Number value() {
+		return getValue();
+	}
+
+	@Override
+	public IMeasure<? extends IMeasure<Q>> inverse() {
+		final IMeasure<? extends IMeasure<Q>> m = new BaseQuantity(getValue(),
+		getUnit().inverse()); // TODO keep value same?
+		return m;
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/converter/LogConverter.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/converter/LogConverter.java
index 8f98e62..02d5693 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/converter/LogConverter.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/converter/LogConverter.java
@@ -1,113 +1,113 @@
-/**
- * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Ikayzo and others - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.converter;
-
-import java.math.BigDecimal;
-import java.math.MathContext;
-
-import org.eclipse.uomo.units.AbstractConverter;
-
-/**
- * <p> This class represents a logarithmic converter of limited precision.
- *     Such converter  is typically used to create logarithmic unit.
- *     For example:[code]
- *     Unit<Dimensionless> BEL = Unit.ONE.transform(new LogConverter(10).inverse());
- *     [/code]</p>
- *
- * <p> Instances of this class are immutable.</p>
- *
- * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.4 ($Revision: 132 $), $Date: 2010-08-10 07:04:41 +0100 (Di, 10 Aug 2010) $
- */
-public final class LogConverter extends AbstractConverter {
-
-    /** The serialVersionUID */
-    private static final long serialVersionUID = -5581266460675123322L;
-
-    /**
-     * Holds the logarithmic base.
-     */
-    private final double base;
-    /**
-     * Holds the natural logarithm of the base.
-     */
-    private final double logOfBase;
-
-    /**
-     * Creates a logarithmic converter having the specified base.
-     *
-     * @param  base the logarithmic base (e.g. <code>Math.E</code> for
-     *         the Natural Logarithm).
-     */
-    public LogConverter(double base) {
-        this.base = base;
-        logOfBase = Math.log(base);
-    }
-
-    /**
-     * Returns the logarithmic base of this converter.
-     *
-     * @return the logarithmic base (e.g. <code>Math.E</code> for
-     *         the Natural Logarithm).
-     */
-    public double getBase() {
-        return base;
-    }
-
-    @Override
-    public AbstractConverter inverse() {
-        return new ExpConverter(base);
-    }
-
-    @Override
-    public final String toString() {
-        return "LogConverter("+ base + ")";
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (!(obj instanceof LogConverter))
-            return false;
-        LogConverter that = (LogConverter) obj;
-        return this.base == that.base;
-    }
-
-    @Override
-    public int hashCode() {
-        long bits = Double.doubleToLongBits(base);
-        return (int) (bits ^ (bits >>> 32));
-    }
-
-    @Override
-    public double convert(double amount) {
-        return Math.log(amount) / logOfBase;
-    }
-
-    @Override
-    public BigDecimal convert(BigDecimal value, MathContext ctx) throws ArithmeticException {
-        return BigDecimal.valueOf(convert(value.doubleValue())); // Reverts to double conversion.
-    }
-    
-	@Override
-	public Number convert(Number value) {
-		if (value instanceof BigDecimal) {
-			return convert((BigDecimal) value, MathContext.DECIMAL128);
-		} else {
-			return convert(value.doubleValue());
-		}
-	}
-
-    @Override
-    public boolean isLinear() {
-        return false;
-    }
-}
+/**
+ * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Ikayzo and others - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.converter;
+
+import java.math.BigDecimal;
+import java.math.MathContext;
+
+import org.eclipse.uomo.units.AbstractConverter;
+
+/**
+ * <p> This class represents a logarithmic converter of limited precision.
+ *     Such converter  is typically used to create logarithmic unit.
+ *     For example:[code]
+ *     Unit<Dimensionless> BEL = Unit.ONE.transform(new LogConverter(10).inverse());
+ *     [/code]</p>
+ *
+ * <p> Instances of this class are immutable.</p>
+ *
+ * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.4 ($Revision: 132 $), $Date: 2010-08-10 07:04:41 +0100 (Di, 10 Aug 2010) $
+ */
+public final class LogConverter extends AbstractConverter {
+
+    /** The serialVersionUID */
+    private static final long serialVersionUID = -5581266460675123322L;
+
+    /**
+     * Holds the logarithmic base.
+     */
+    private final double base;
+    /**
+     * Holds the natural logarithm of the base.
+     */
+    private final double logOfBase;
+
+    /**
+     * Creates a logarithmic converter having the specified base.
+     *
+     * @param  base the logarithmic base (e.g. <code>Math.E</code> for
+     *         the Natural Logarithm).
+     */
+    public LogConverter(double base) {
+        this.base = base;
+        logOfBase = Math.log(base);
+    }
+
+    /**
+     * Returns the logarithmic base of this converter.
+     *
+     * @return the logarithmic base (e.g. <code>Math.E</code> for
+     *         the Natural Logarithm).
+     */
+    public double getBase() {
+        return base;
+    }
+
+    @Override
+    public AbstractConverter inverse() {
+        return new ExpConverter(base);
+    }
+
+    @Override
+    public final String toString() {
+        return "LogConverter("+ base + ")";
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof LogConverter))
+            return false;
+        LogConverter that = (LogConverter) obj;
+        return this.base == that.base;
+    }
+
+    @Override
+    public int hashCode() {
+        long bits = Double.doubleToLongBits(base);
+        return (int) (bits ^ (bits >>> 32));
+    }
+
+    @Override
+    public double convert(double amount) {
+        return Math.log(amount) / logOfBase;
+    }
+
+    @Override
+    public BigDecimal convert(BigDecimal value, MathContext ctx) throws ArithmeticException {
+        return BigDecimal.valueOf(convert(value.doubleValue())); // Reverts to double conversion.
+    }
+    
+	@Override
+	public Number convert(Number value) {
+		if (value instanceof BigDecimal) {
+			return convert((BigDecimal) value, MathContext.DECIMAL128);
+		} else {
+			return convert(value.doubleValue());
+		}
+	}
+
+    @Override
+    public boolean isLinear() {
+        return false;
+    }
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/format/SymbolMapImpl.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/format/SymbolMapImpl.java
index 740a1bb..8f3cf01 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/format/SymbolMapImpl.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/format/SymbolMapImpl.java
@@ -1,216 +1,216 @@
-/**
- * Copyright (c) 2005, 2011, Werner Keil, JScience and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Eric Russell - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.format;
-
-import java.lang.reflect.Field;
-import java.math.BigInteger;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.ResourceBundle;
-
-import org.eclipse.uomo.units.AbstractUnit;
-import org.eclipse.uomo.units.SymbolMap;
-import org.eclipse.uomo.units.impl.converter.MultiplyConverter;
-import org.eclipse.uomo.units.impl.converter.RationalConverter;
-import org.unitsofmeasurement.unit.Unit;
-import org.unitsofmeasurement.unit.UnitConverter;
-
-
-/**
- * <p> This class holds the default implementation of the SymbolMap
- *     interface.</p>
- *
- * <p> No attempt is made to verify the uniqueness of the mappings.</p>
- *
- * <p> Mappings are read from a <code>ResourceBundle</code>, the keys
- *     of which should consist of a fully-qualified class name, followed
- *     by a dot ('.'), and then the name of a static field belonging
- *     to that class, followed optionally by another dot and a number.
- *     If the trailing dot and number are not present, the value
- *     associated with the key is treated as a
- *     {@linkplain SymbolMap#label(org.unitsofmeasure.Unit, String) label},
- *     otherwise if the trailing dot and number are present, the value
- *     is treated as an {@linkplain SymbolMap#alias(org.unitsofmeasure.Unit,String) alias}.
- *     Aliases map from String to Unit only, whereas labels map in both
- *     directions. A given unit may have any number of aliases, but may
- *     have only one label.</p>
- *
- * @author <a href="mailto:eric-r@northwestern.edu">Eric Russell</a>
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.8 ($Revision: 212 $), $Date: 2010-09-13 23:50:44 +0200 (Mo, 13 Sep 2010) $
- */
-class SymbolMapImpl implements SymbolMap {
-	// TODO fix issue with duplicate symbols (i.E. in different systems)
-    private final Map<String, Unit<?>> symbolToUnit;
-    private final Map<Unit<?>, String> unitToSymbol;
-    private final Map<String, ParsePrefix> symbolToPrefix;
-    private final Map<ParsePrefix, String> prefixToSymbol;
-    private final Map<UnitConverter, ParsePrefix> converterToPrefix;
-
-    /**
-     * Creates an empty mapping.
-     */
-    public SymbolMapImpl () {
-        symbolToUnit = new HashMap<String, Unit<?>>();
-        unitToSymbol = new HashMap<Unit<?>, String>();
-        symbolToPrefix = new HashMap<String, ParsePrefix>();
-        prefixToSymbol = new HashMap<ParsePrefix, String>();
-        converterToPrefix = new HashMap<UnitConverter, ParsePrefix>();
-    }
-
-    /**
-     * Creates a symbol map from the specified resource bundle,
-     *
-     * @param rb the resource bundle.
-     */
-    public SymbolMapImpl (ResourceBundle rb) {
-        this();
-        for (Enumeration<String> i = rb.getKeys(); i.hasMoreElements();) {
-            String fqn = i.nextElement();
-            String symbol = rb.getString(fqn);
-            boolean isAlias = false;
-            int lastDot = fqn.lastIndexOf('.');
-            String className = fqn.substring(0, lastDot);
-            String fieldName = fqn.substring(lastDot+1, fqn.length());
-            if (Character.isDigit(fieldName.charAt(0))) {
-                isAlias = true;
-                fqn = className;
-                lastDot = fqn.lastIndexOf('.');
-                className = fqn.substring(0, lastDot);
-                fieldName = fqn.substring(lastDot+1, fqn.length());
-            }
-            try {
-                Class<?> c = Class.forName(className);
-                Field field = c.getField(fieldName);
-                Object value = field.get(null);
-                if (value instanceof AbstractUnit<?>) {
-                    if (isAlias) {
-                        alias((AbstractUnit<?>)value, symbol);
-                    } else {
-                        label((AbstractUnit<?>)value, symbol);
-                    }
-                } else if (value instanceof ParsePrefix) {
-                    label((ParsePrefix)value, symbol);
-                } else {
-                    throw new ClassCastException("" + value + " to Unit or Prefix");  //$NON-NLS-2$ //$NON-NLS-1$ //$NON-NLS-1$
-                }
-            } catch (Exception e) {
-                System.err.println("Error reading Unit names: " + e.toString()); //$NON-NLS-1$
-            }
-        }
-    }
-
-//    public void label (Unit<?> unit, String symbol) {
-//        symbolToUnit.put(symbol, unit);
-//        unitToSymbol.put(unit, symbol);
-//    }
-//
-//    public void alias (Unit<?> unit, String symbol) {
-//        symbolToUnit.put(symbol, unit);
-//    }
-
-
-    public Unit<?> getUnit (String symbol) {
-        return symbolToUnit.get(symbol);
-    }
-
-//    public String getSymbol (Unit<?> unit) {
-//        return unitToSymbol.get(unit);
-//    }
-
-   public UnitConverter getConverter(String prefix) {
-        ParsePrefix prefixObject = symbolToPrefix.get(prefix);
-        if (prefixObject == null) return null;
-        return prefixObject.getConverter();
-    }
-
-    /**
-     * Attaches a label to the specified prefix. For example:[code]
-     *    symbolMap.label(Prefix.GIGA, "G");
-     *    symbolMap.label(Prefix.MICRO, "µ");
-     * [/code]
-     */
-    void label(ParsePrefix prefix, String symbol) {
-        symbolToPrefix.put(symbol, prefix);
-        prefixToSymbol.put(prefix, symbol);
-        converterToPrefix.put(prefix.getConverter(), prefix);
-        // adding MultiplyConverters (ensuring KILO(METRE) = METRE.multiply(1000)
-        if (prefix.getConverter() instanceof RationalConverter) {
-        	RationalConverter rc = (RationalConverter)prefix.getConverter();
-        	if (rc.getDividend() != null && BigInteger.ONE.equals(rc.getDivisor())) {
-        		converterToPrefix.put(new MultiplyConverter(rc.getDividend().doubleValue()), prefix);
-        	} else if (rc.getDivisor() != null && BigInteger.ONE.equals(rc.getDividend())) {
-        		converterToPrefix.put(new MultiplyConverter(1d / rc.getDivisor().doubleValue()), prefix);
-        	}
-        }
-    }
-
-    /**
-     * Returns the prefix (if any) for the specified symbol.
-     *
-     * @param symbol the unit symbol.
-     * @return the corresponding prefix or <code>null</code> if none.
-     */
-    ParsePrefix getPrefix (String symbol) {
-        for (Iterator<String> i = symbolToPrefix.keySet().iterator(); i.hasNext(); ) {
-            String pfSymbol = i.next();
-            if (symbol.startsWith(pfSymbol)) {
-                return symbolToPrefix.get(pfSymbol);
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the prefix for the specified converter.
-     *
-     * @param converter the unit converter.
-     * @return the corresponding prefix or <code>null</code> if none.
-     */
-    ParsePrefix getPrefixObject (UnitConverter converter) {
-        return converterToPrefix.get(converter);
-    }
-
-    /**
-     * Returns the symbol for the specified prefix.
-     *
-     * @param prefix the prefix.
-     * @return the corresponding symbol or <code>null</code> if none.
-     */
-    String getSymbol (ParsePrefix prefix) {
-        return prefixToSymbol.get(prefix);
-    }
-
-	public void alias(Unit<?> unit, String symbol) {
-		symbolToUnit.put(symbol, unit);
-	}
-
-	public String getPrefix(UnitConverter converter) {
-        ParsePrefix prefix = getPrefixObject(converter);
-        if (prefix == null) return null;
-        return prefixToSymbol.get(prefix);
-	}
-
-	public String getSymbol(Unit<?> unit) {
-		return unitToSymbol.get(unit);
-	}
-
-	public void label(Unit<?> unit, String symbol) {
-        symbolToUnit.put(symbol, unit);
-        unitToSymbol.put(unit, symbol);
-	}
-
-	public void prefix(UnitConverter cvtr, String prefix) {
-		throw new UnsupportedOperationException("Prefixes are not modifiable"); //$NON-NLS-1$
-	}
-}
+/**
+ * Copyright (c) 2005, 2011, Werner Keil, JScience and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Eric Russell - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.format;
+
+import java.lang.reflect.Field;
+import java.math.BigInteger;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.ResourceBundle;
+
+import org.eclipse.uomo.units.AbstractUnit;
+import org.eclipse.uomo.units.SymbolMap;
+import org.eclipse.uomo.units.impl.converter.MultiplyConverter;
+import org.eclipse.uomo.units.impl.converter.RationalConverter;
+import org.unitsofmeasurement.unit.Unit;
+import org.unitsofmeasurement.unit.UnitConverter;
+
+
+/**
+ * <p> This class holds the default implementation of the SymbolMap
+ *     interface.</p>
+ *
+ * <p> No attempt is made to verify the uniqueness of the mappings.</p>
+ *
+ * <p> Mappings are read from a <code>ResourceBundle</code>, the keys
+ *     of which should consist of a fully-qualified class name, followed
+ *     by a dot ('.'), and then the name of a static field belonging
+ *     to that class, followed optionally by another dot and a number.
+ *     If the trailing dot and number are not present, the value
+ *     associated with the key is treated as a
+ *     {@linkplain SymbolMap#label(org.unitsofmeasure.Unit, String) label},
+ *     otherwise if the trailing dot and number are present, the value
+ *     is treated as an {@linkplain SymbolMap#alias(org.unitsofmeasure.Unit,String) alias}.
+ *     Aliases map from String to Unit only, whereas labels map in both
+ *     directions. A given unit may have any number of aliases, but may
+ *     have only one label.</p>
+ *
+ * @author <a href="mailto:eric-r@northwestern.edu">Eric Russell</a>
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.8 ($Revision: 212 $), $Date: 2010-09-13 23:50:44 +0200 (Mo, 13 Sep 2010) $
+ */
+class SymbolMapImpl implements SymbolMap {
+	// TODO fix issue with duplicate symbols (i.E. in different systems)
+    private final Map<String, Unit<?>> symbolToUnit;
+    private final Map<Unit<?>, String> unitToSymbol;
+    private final Map<String, ParsePrefix> symbolToPrefix;
+    private final Map<ParsePrefix, String> prefixToSymbol;
+    private final Map<UnitConverter, ParsePrefix> converterToPrefix;
+
+    /**
+     * Creates an empty mapping.
+     */
+    public SymbolMapImpl () {
+        symbolToUnit = new HashMap<String, Unit<?>>();
+        unitToSymbol = new HashMap<Unit<?>, String>();
+        symbolToPrefix = new HashMap<String, ParsePrefix>();
+        prefixToSymbol = new HashMap<ParsePrefix, String>();
+        converterToPrefix = new HashMap<UnitConverter, ParsePrefix>();
+    }
+
+    /**
+     * Creates a symbol map from the specified resource bundle,
+     *
+     * @param rb the resource bundle.
+     */
+    public SymbolMapImpl (ResourceBundle rb) {
+        this();
+        for (Enumeration<String> i = rb.getKeys(); i.hasMoreElements();) {
+            String fqn = i.nextElement();
+            String symbol = rb.getString(fqn);
+            boolean isAlias = false;
+            int lastDot = fqn.lastIndexOf('.');
+            String className = fqn.substring(0, lastDot);
+            String fieldName = fqn.substring(lastDot+1, fqn.length());
+            if (Character.isDigit(fieldName.charAt(0))) {
+                isAlias = true;
+                fqn = className;
+                lastDot = fqn.lastIndexOf('.');
+                className = fqn.substring(0, lastDot);
+                fieldName = fqn.substring(lastDot+1, fqn.length());
+            }
+            try {
+                Class<?> c = Class.forName(className);
+                Field field = c.getField(fieldName);
+                Object value = field.get(null);
+                if (value instanceof AbstractUnit<?>) {
+                    if (isAlias) {
+                        alias((AbstractUnit<?>)value, symbol);
+                    } else {
+                        label((AbstractUnit<?>)value, symbol);
+                    }
+                } else if (value instanceof ParsePrefix) {
+                    label((ParsePrefix)value, symbol);
+                } else {
+                    throw new ClassCastException("" + value + " to Unit or Prefix");  //$NON-NLS-2$ //$NON-NLS-1$ //$NON-NLS-1$
+                }
+            } catch (Exception e) {
+                System.err.println("Error reading Unit names: " + e.toString()); //$NON-NLS-1$
+            }
+        }
+    }
+
+//    public void label (Unit<?> unit, String symbol) {
+//        symbolToUnit.put(symbol, unit);
+//        unitToSymbol.put(unit, symbol);
+//    }
+//
+//    public void alias (Unit<?> unit, String symbol) {
+//        symbolToUnit.put(symbol, unit);
+//    }
+
+
+    public Unit<?> getUnit (String symbol) {
+        return symbolToUnit.get(symbol);
+    }
+
+//    public String getSymbol (Unit<?> unit) {
+//        return unitToSymbol.get(unit);
+//    }
+
+   public UnitConverter getConverter(String prefix) {
+        ParsePrefix prefixObject = symbolToPrefix.get(prefix);
+        if (prefixObject == null) return null;
+        return prefixObject.getConverter();
+    }
+
+    /**
+     * Attaches a label to the specified prefix. For example:[code]
+     *    symbolMap.label(Prefix.GIGA, "G");
+     *    symbolMap.label(Prefix.MICRO, "µ");
+     * [/code]
+     */
+    void label(ParsePrefix prefix, String symbol) {
+        symbolToPrefix.put(symbol, prefix);
+        prefixToSymbol.put(prefix, symbol);
+        converterToPrefix.put(prefix.getConverter(), prefix);
+        // adding MultiplyConverters (ensuring KILO(METRE) = METRE.multiply(1000)
+        if (prefix.getConverter() instanceof RationalConverter) {
+        	RationalConverter rc = (RationalConverter)prefix.getConverter();
+        	if (rc.getDividend() != null && BigInteger.ONE.equals(rc.getDivisor())) {
+        		converterToPrefix.put(new MultiplyConverter(rc.getDividend().doubleValue()), prefix);
+        	} else if (rc.getDivisor() != null && BigInteger.ONE.equals(rc.getDividend())) {
+        		converterToPrefix.put(new MultiplyConverter(1d / rc.getDivisor().doubleValue()), prefix);
+        	}
+        }
+    }
+
+    /**
+     * Returns the prefix (if any) for the specified symbol.
+     *
+     * @param symbol the unit symbol.
+     * @return the corresponding prefix or <code>null</code> if none.
+     */
+    ParsePrefix getPrefix (String symbol) {
+        for (Iterator<String> i = symbolToPrefix.keySet().iterator(); i.hasNext(); ) {
+            String pfSymbol = i.next();
+            if (symbol.startsWith(pfSymbol)) {
+                return symbolToPrefix.get(pfSymbol);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns the prefix for the specified converter.
+     *
+     * @param converter the unit converter.
+     * @return the corresponding prefix or <code>null</code> if none.
+     */
+    ParsePrefix getPrefixObject (UnitConverter converter) {
+        return converterToPrefix.get(converter);
+    }
+
+    /**
+     * Returns the symbol for the specified prefix.
+     *
+     * @param prefix the prefix.
+     * @return the corresponding symbol or <code>null</code> if none.
+     */
+    String getSymbol (ParsePrefix prefix) {
+        return prefixToSymbol.get(prefix);
+    }
+
+	public void alias(Unit<?> unit, String symbol) {
+		symbolToUnit.put(symbol, unit);
+	}
+
+	public String getPrefix(UnitConverter converter) {
+        ParsePrefix prefix = getPrefixObject(converter);
+        if (prefix == null) return null;
+        return prefixToSymbol.get(prefix);
+	}
+
+	public String getSymbol(Unit<?> unit) {
+		return unitToSymbol.get(unit);
+	}
+
+	public void label(Unit<?> unit, String symbol) {
+        symbolToUnit.put(symbol, unit);
+        unitToSymbol.put(unit, symbol);
+	}
+
+	public void prefix(UnitConverter cvtr, String prefix) {
+		throw new UnsupportedOperationException("Prefixes are not modifiable"); //$NON-NLS-1$
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/format/TokenMgrError.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/format/TokenMgrError.java
index d48cbb2..8ec9b7f 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/format/TokenMgrError.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/format/TokenMgrError.java
@@ -1,158 +1,158 @@
-/**
- * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Ikayzo and others - initial API and implementation
- */
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 5.0 */
-/* JavaCCOptions: */
-package org.eclipse.uomo.units.impl.format;
-
-/** Token Manager Error. */
-class TokenMgrError extends Error
-{
-
-  /**
-   * The version identifier for this Serializable class.
-   * Increment only if the <i>serialized</i> form of the
-   * class changes.
-   */
-    private static final long serialVersionUID = -3348968864772188432L;
-
-  /*
-   * Ordinals for various reasons why an Error of this type can be thrown.
-   */
-
-
-  /**
-   * Lexical error occurred.
-   */
-  static final int LEXICAL_ERROR = 0;
-
-  /**
-   * An attempt was made to create a second instance of a static token manager.
-   */
-  static final int STATIC_LEXER_ERROR = 1;
-
-  /**
-   * Tried to change to an invalid lexical state.
-   */
-  static final int INVALID_LEXICAL_STATE = 2;
-
-  /**
-   * Detected (and bailed out of) an infinite loop in the token manager.
-   */
-  static final int LOOP_DETECTED = 3;
-
-  /**
-   * Indicates the reason why the exception is thrown. It will have
-   * one of the above 4 values.
-   */
-  int errorCode;
-
-  /**
-   * Replaces unprintable characters by their escaped (or unicode escaped)
-   * equivalents in the given string
-   */
-  static final String addEscapes(String str) {
-    StringBuffer retval = new StringBuffer();
-    char ch;
-    for (int i = 0; i < str.length(); i++) {
-      switch (str.charAt(i))
-      {
-        case 0 :
-          continue;
-        case '\b':
-          retval.append("\\b");
-          continue;
-        case '\t':
-          retval.append("\\t");
-          continue;
-        case '\n':
-          retval.append("\\n");
-          continue;
-        case '\f':
-          retval.append("\\f");
-          continue;
-        case '\r':
-          retval.append("\\r");
-          continue;
-        case '\"':
-          retval.append("\\\"");
-          continue;
-        case '\'':
-          retval.append("\\\'");
-          continue;
-        case '\\':
-          retval.append("\\\\");
-          continue;
-        default:
-          if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-            String s = "0000" + Integer.toString(ch, 16);
-            retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-          } else {
-            retval.append(ch);
-          }
-          continue;
-      }
-    }
-    return retval.toString();
-  }
-
-  /**
-   * Returns a detailed message for the Error when it is thrown by the
-   * token manager to indicate a lexical error.
-   * Parameters :
-   *    EOFSeen     : indicates if EOF caused the lexical error
-   *    curLexState : lexical state in which this error occurred
-   *    errorLine   : line number when the error occurred
-   *    errorColumn : column number when the error occurred
-   *    errorAfter  : prefix that was seen before this error occurred
-   *    curchar     : the offending character
-   * Note: You can customize the lexical error message by modifying this method.
-   */
-  static String lexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
-    return("Lexical error at line " +
-          errorLine + ", column " +
-          errorColumn + ".  Encountered: " +
-          (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
-          "after : \"" + addEscapes(errorAfter) + "\"");
-  }
-
-  /**
-   * You can also modify the body of this method to customize your error messages.
-   * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
-   * of end-users concern, so you can return something like :
-   *
-   *     "Internal Error : Please file a bug report .... "
-   *
-   * from this method for such cases in the release version of your parser.
-   */
-  public String getMessage() {
-    return super.getMessage();
-  }
-
-  /*
-   * Constructors of various flavors follow.
-   */
-
-  /** No arg constructor. */
-  public TokenMgrError() {
-  }
-
-  /** Constructor with message and reason. */
-  public TokenMgrError(String message, int reason) {
-    super(message);
-    errorCode = reason;
-  }
-
-  /** Full Constructor. */
-  public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
-    this(lexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
-  }
-}
-/* JavaCC - OriginalChecksum=8a6e5be586cca28053ad55584e013006 (do not edit this line) */
+/**
+ * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Ikayzo and others - initial API and implementation
+ */
+/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 5.0 */
+/* JavaCCOptions: */
+package org.eclipse.uomo.units.impl.format;
+
+/** Token Manager Error. */
+class TokenMgrError extends Error
+{
+
+  /**
+   * The version identifier for this Serializable class.
+   * Increment only if the <i>serialized</i> form of the
+   * class changes.
+   */
+    private static final long serialVersionUID = -3348968864772188432L;
+
+  /*
+   * Ordinals for various reasons why an Error of this type can be thrown.
+   */
+
+
+  /**
+   * Lexical error occurred.
+   */
+  static final int LEXICAL_ERROR = 0;
+
+  /**
+   * An attempt was made to create a second instance of a static token manager.
+   */
+  static final int STATIC_LEXER_ERROR = 1;
+
+  /**
+   * Tried to change to an invalid lexical state.
+   */
+  static final int INVALID_LEXICAL_STATE = 2;
+
+  /**
+   * Detected (and bailed out of) an infinite loop in the token manager.
+   */
+  static final int LOOP_DETECTED = 3;
+
+  /**
+   * Indicates the reason why the exception is thrown. It will have
+   * one of the above 4 values.
+   */
+  int errorCode;
+
+  /**
+   * Replaces unprintable characters by their escaped (or unicode escaped)
+   * equivalents in the given string
+   */
+  static final String addEscapes(String str) {
+    StringBuffer retval = new StringBuffer();
+    char ch;
+    for (int i = 0; i < str.length(); i++) {
+      switch (str.charAt(i))
+      {
+        case 0 :
+          continue;
+        case '\b':
+          retval.append("\\b");
+          continue;
+        case '\t':
+          retval.append("\\t");
+          continue;
+        case '\n':
+          retval.append("\\n");
+          continue;
+        case '\f':
+          retval.append("\\f");
+          continue;
+        case '\r':
+          retval.append("\\r");
+          continue;
+        case '\"':
+          retval.append("\\\"");
+          continue;
+        case '\'':
+          retval.append("\\\'");
+          continue;
+        case '\\':
+          retval.append("\\\\");
+          continue;
+        default:
+          if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+            String s = "0000" + Integer.toString(ch, 16);
+            retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+          } else {
+            retval.append(ch);
+          }
+          continue;
+      }
+    }
+    return retval.toString();
+  }
+
+  /**
+   * Returns a detailed message for the Error when it is thrown by the
+   * token manager to indicate a lexical error.
+   * Parameters :
+   *    EOFSeen     : indicates if EOF caused the lexical error
+   *    curLexState : lexical state in which this error occurred
+   *    errorLine   : line number when the error occurred
+   *    errorColumn : column number when the error occurred
+   *    errorAfter  : prefix that was seen before this error occurred
+   *    curchar     : the offending character
+   * Note: You can customize the lexical error message by modifying this method.
+   */
+  static String lexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
+    return("Lexical error at line " +
+          errorLine + ", column " +
+          errorColumn + ".  Encountered: " +
+          (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
+          "after : \"" + addEscapes(errorAfter) + "\"");
+  }
+
+  /**
+   * You can also modify the body of this method to customize your error messages.
+   * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
+   * of end-users concern, so you can return something like :
+   *
+   *     "Internal Error : Please file a bug report .... "
+   *
+   * from this method for such cases in the release version of your parser.
+   */
+  public String getMessage() {
+    return super.getMessage();
+  }
+
+  /*
+   * Constructors of various flavors follow.
+   */
+
+  /** No arg constructor. */
+  public TokenMgrError() {
+  }
+
+  /** Constructor with message and reason. */
+  public TokenMgrError(String message, int reason) {
+    super(message);
+    errorCode = reason;
+  }
+
+  /** Full Constructor. */
+  public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
+    this(lexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
+  }
+}
+/* JavaCC - OriginalChecksum=8a6e5be586cca28053ad55584e013006 (do not edit this line) */
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/format/UnitFormatServiceImpl.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/format/UnitFormatServiceImpl.java
index e3649fd..49699a1 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/format/UnitFormatServiceImpl.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/format/UnitFormatServiceImpl.java
@@ -1,42 +1,42 @@
-/**
- * Copyright (c) 2005, 2010, Werner Keil, JScience and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.format;
-
-import java.util.Locale;
-
-import org.eclipse.uomo.units.AbstractFormat;
-import org.unitsofmeasurement.service.UnitFormatService;
-import org.unitsofmeasurement.unit.UnitFormat;
-
-import com.ibm.icu.util.ULocale;
-
-/**
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 0.5 ($Revision: 308 $), $Date: 2010-11-02 15:56:52 +0000 (Di, 02 Nov 2010) $
- */
-public class UnitFormatServiceImpl implements UnitFormatService {
-
-	@Override
-	public UnitFormat getUnitFormat() {
-		return AbstractFormat.getUnitFormat();
-	}
-
-	@Override
-	public UnitFormat getUnitFormat(String name) {
-		return getUnitFormat();
-	}
-
-	@Override
-	public UnitFormat getUnitFormat(Locale locale) {
-		return AbstractFormat.getUnitFormat(ULocale.forLocale(locale));
-	}
-
-}
+/**
+ * Copyright (c) 2005, 2010, Werner Keil, JScience and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.format;
+
+import java.util.Locale;
+
+import org.eclipse.uomo.units.AbstractFormat;
+import org.unitsofmeasurement.service.UnitFormatService;
+import org.unitsofmeasurement.unit.UnitFormat;
+
+import com.ibm.icu.util.ULocale;
+
+/**
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 0.5 ($Revision: 308 $), $Date: 2010-11-02 15:56:52 +0000 (Di, 02 Nov 2010) $
+ */
+public class UnitFormatServiceImpl implements UnitFormatService {
+
+	@Override
+	public UnitFormat getUnitFormat() {
+		return AbstractFormat.getUnitFormat();
+	}
+
+	@Override
+	public UnitFormat getUnitFormat(String name) {
+		return getUnitFormat();
+	}
+
+	@Override
+	public UnitFormat getUnitFormat(Locale locale) {
+		return AbstractFormat.getUnitFormat(ULocale.forLocale(locale));
+	}
+
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/format/UnitParserTokenManager.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/format/UnitParserTokenManager.java
index 5316ad3..6546138 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/format/UnitParserTokenManager.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/format/UnitParserTokenManager.java
@@ -1,482 +1,482 @@
-/**
- * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Ikayzo and others - initial API and implementation
- */
-/* Generated By:JavaCC: Do not edit this line. UnitParserTokenManager.java */
-package org.eclipse.uomo.units.impl.format;
-
-/** Token Manager. */
-class UnitParserTokenManager implements UnitParserConstants
-{
-
-  /** Debug output. */
-  java.io.PrintStream debugStream = System.out;
-  /** Set debug output. */
-  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
-//private final int jjStopStringLiteralDfa_0(int pos, long active0)
-//{
-//   switch (pos)
-//   {
-//      default :
-//         return -1;
-//   }
-//}
-//private final int jjStartNfa_0(int pos, long active0)
-//{
-//   return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
-//}
-private int jjStopAtPos(int pos, int kind)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   return pos + 1;
-}
-private int jjMoveStringLiteralDfa0_0()
-{
-   switch(curChar)
-   {
-      case 40:
-         return jjStopAtPos(0, 12);
-      case 41:
-         return jjStopAtPos(0, 13);
-      case 42:
-         return jjStopAtPos(0, 7);
-      case 43:
-         return jjStopAtPos(0, 5);
-      case 45:
-         return jjStopAtPos(0, 6);
-      case 47:
-         return jjStopAtPos(0, 9);
-      case 58:
-         return jjStopAtPos(0, 11);
-      case 94:
-         return jjStopAtPos(0, 10);
-      case 101:
-         return jjStartNfaWithStates_0(0, 19, 7);
-      case 183:
-         return jjStopAtPos(0, 8);
-      default :
-         return jjMoveNfa_0(6, 0);
-   }
-}
-private int jjStartNfaWithStates_0(int pos, int kind, int state)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) { return pos + 1; }
-   return jjMoveNfa_0(state, pos + 1);
-}
-static final long[] jjbitVec0 = {
-   0x0L, 0x0L, 0x20c000000000000L, 0x0L
-};
-static final long[] jjbitVec1 = {
-   0x0L, 0x3f1000000000000L, 0x0L, 0x0L
-};
-static final long[] jjbitVec2 = {
-   0xfffffffefffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-static final long[] jjbitVec4 = {
-   0x0L, 0x0L, 0xfd73ffffffffffffL, 0xffffffffffffffffL
-};
-static final long[] jjbitVec5 = {
-   0xffffffffffffffffL, 0xfc0effffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-private int jjMoveNfa_0(int startState, int curPos)
-{
-   int startsAt = 0;
-   jjnewStateCnt = 15;
-   int i = 1;
-   jjstateSet[0] = startState;
-   int kind = 0x7fffffff;
-   for (;;)
-   {
-      if (++jjround == 0x7fffffff)
-         ReInitRounds();
-      if (curChar < 64)
-      {
-         long l = 1L << curChar;
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 6:
-                  if ((0xf80010fe00000000L & l) != 0L)
-                  {
-                     if (kind > 20)
-                        kind = 20;
-                     jjCheckNAdd(7);
-                  }
-                  else if ((0x3ff000000000000L & l) != 0L)
-                  {
-                     if (kind > 14)
-                        kind = 14;
-                     jjCheckNAddStates(0, 4);
-                  }
-                  else if (curChar == 46)
-                     jjCheckNAdd(2);
-                  break;
-               case 1:
-                  if (curChar == 46)
-                     jjCheckNAdd(2);
-                  break;
-               case 2:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 16)
-                     kind = 16;
-                  jjCheckNAddTwoStates(2, 3);
-                  break;
-               case 4:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(5);
-                  break;
-               case 5:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 16)
-                     kind = 16;
-                  jjCheckNAdd(5);
-                  break;
-               case 7:
-                  if ((0xfbff10fe00000000L & l) == 0L)
-                     break;
-                  if (kind > 20)
-                     kind = 20;
-                  jjCheckNAdd(7);
-                  break;
-               case 8:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 14)
-                     kind = 14;
-                  jjCheckNAddStates(0, 4);
-                  break;
-               case 9:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 14)
-                     kind = 14;
-                  jjCheckNAdd(9);
-                  break;
-               case 10:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 16)
-                     kind = 16;
-                  jjCheckNAddStates(5, 8);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 6:
-                  if ((0xffffffffbfffffffL & l) != 0L)
-                  {
-                     if (kind > 20)
-                        kind = 20;
-                     jjCheckNAdd(7);
-                  }
-                  if (curChar == 108)
-                     jjAddStates(9, 10);
-                  break;
-               case 3:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(11, 12);
-                  break;
-               case 7:
-                  if ((0xffffffffbfffffffL & l) == 0L)
-                     break;
-                  if (kind > 20)
-                     kind = 20;
-                  jjCheckNAdd(7);
-                  break;
-               case 11:
-                  if (curChar == 108)
-                     jjAddStates(9, 10);
-                  break;
-               case 12:
-                  if (curChar == 111)
-                     jjstateSet[jjnewStateCnt++] = 13;
-                  break;
-               case 13:
-                  if (curChar == 103 && kind > 17)
-                     kind = 17;
-                  break;
-               case 14:
-                  if (curChar == 110 && kind > 18)
-                     kind = 18;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int hiByte = (int)(curChar >> 8);
-         int i1 = hiByte >> 6;
-         long l1 = 1L << (hiByte & 077);
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 6:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                  {
-                     if (kind > 15)
-                        kind = 15;
-                     jjCheckNAdd(0);
-                  }
-                  if (jjCanMove_1(hiByte, i1, i2, l1, l2))
-                  {
-                     if (kind > 20)
-                        kind = 20;
-                     jjCheckNAdd(7);
-                  }
-                  break;
-               case 0:
-                  if (!jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     break;
-                  if (kind > 15)
-                     kind = 15;
-                  jjCheckNAdd(0);
-                  break;
-               case 7:
-                  if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
-                     break;
-                  if (kind > 20)
-                     kind = 20;
-                  jjCheckNAdd(7);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 15 - (jjnewStateCnt = startsAt)))
-         return curPos;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { return curPos; }
-   }
-}
-static final int[] jjnextStates = {
-   9, 1, 2, 3, 10, 1, 2, 3, 10, 12, 14, 4, 5,
-};
-private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
-{
-   switch(hiByte)
-   {
-      case 0:
-         return ((jjbitVec0[i2] & l2) != 0L);
-      case 32:
-         return ((jjbitVec1[i2] & l2) != 0L);
-      default :
-         return false;
-   }
-}
-private static final boolean jjCanMove_1(int hiByte, int i1, int i2, long l1, long l2)
-{
-   switch(hiByte)
-   {
-      case 0:
-         return ((jjbitVec4[i2] & l2) != 0L);
-      case 32:
-         return ((jjbitVec5[i2] & l2) != 0L);
-      default :
-         if ((jjbitVec2[i1] & l1) != 0L)
-            return true;
-         return false;
-   }
-}
-
-/** Token literal values. */
-private static final String[] jjstrLiteralImages = {
-"", null, null, null, null, "\53", "\55", "\52", "\267", "\57", "\136", "\72",
-"\50", "\51", null, null, null, null, null, "\145", null, };
-
-/** Lexer state names. */
-//private static final String[] lexStateNames = {
-//   "DEFAULT",
-//};
-protected SimpleCharStream input_stream;
-private final int[] jjrounds = new int[15];
-private final int[] jjstateSet = new int[30];
-protected char curChar;
-/** Constructor. */
-UnitParserTokenManager(SimpleCharStream stream){
-   if (SimpleCharStream.staticFlag)
-      throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
-   input_stream = stream;
-}
-
-/** Constructor. */
-UnitParserTokenManager(SimpleCharStream stream, int lexState){
-   this(stream);
-   switchTo(lexState);
-}
-
-/** Reinitialise parser. */
-void reInit(SimpleCharStream stream)
-{
-   jjmatchedPos = jjnewStateCnt = 0;
-   curLexState = defaultLexState;
-   input_stream = stream;
-   ReInitRounds();
-}
-private void ReInitRounds()
-{
-   int i;
-   jjround = 0x80000001;
-   for (i = 15; i-- > 0;)
-      jjrounds[i] = 0x80000000;
-}
-
-/** Reinitialise parser. */
-void reInit(SimpleCharStream stream, int lexState)
-{
-   reInit(stream);
-   switchTo(lexState);
-}
-
-/** Switch to specified lex state. */
-void switchTo(int lexState)
-{
-   if (lexState >= 1 || lexState < 0)
-      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
-   else
-      curLexState = lexState;
-}
-
-protected Token jjFillToken()
-{
-   final Token t;
-   final String curTokenImage;
-   final int beginLine;
-   final int endLine;
-   final int beginColumn;
-   final int endColumn;
-   String im = jjstrLiteralImages[jjmatchedKind];
-   curTokenImage = (im == null) ? input_stream.getImage() : im;
-   beginLine = input_stream.getBeginLine();
-   beginColumn = input_stream.getBeginColumn();
-   endLine = input_stream.getEndLine();
-   endColumn = input_stream.getEndColumn();
-   t = Token.newToken(jjmatchedKind, curTokenImage);
-
-   t.beginLine = beginLine;
-   t.endLine = endLine;
-   t.beginColumn = beginColumn;
-   t.endColumn = endColumn;
-
-   return t;
-}
-
-int curLexState = 0;
-int defaultLexState = 0;
-int jjnewStateCnt;
-int jjround;
-int jjmatchedPos;
-int jjmatchedKind;
-
-/** Get the next Token. */
-Token getNextToken()
-{
-  Token matchedToken;
-  int curPos = 0;
-
-//  EOFLoop :
-  for (;;)
-  {
-   try
-   {
-      curChar = input_stream.beginToken();
-   }
-   catch(java.io.IOException e)
-   {
-      jjmatchedKind = 0;
-      matchedToken = jjFillToken();
-      return matchedToken;
-   }
-
-   jjmatchedKind = 0x7fffffff;
-   jjmatchedPos = 0;
-   curPos = jjMoveStringLiteralDfa0_0();
-   if (jjmatchedKind != 0x7fffffff)
-   {
-      if (jjmatchedPos + 1 < curPos)
-         input_stream.backup(curPos - jjmatchedPos - 1);
-         matchedToken = jjFillToken();
-         return matchedToken;
-   }
-   int error_line = input_stream.getEndLine();
-   int error_column = input_stream.getEndColumn();
-   String error_after = null;
-   boolean EOFSeen = false;
-   try { input_stream.readChar(); input_stream.backup(1); }
-   catch (java.io.IOException e1) {
-      EOFSeen = true;
-      error_after = curPos <= 1 ? "" : input_stream.getImage();
-      if (curChar == '\n' || curChar == '\r') {
-         error_line++;
-         error_column = 0;
-      }
-      else
-         error_column++;
-   }
-   if (!EOFSeen) {
-      input_stream.backup(1);
-      error_after = curPos <= 1 ? "" : input_stream.getImage();
-   }
-   throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
-  }
-}
-
-private void jjCheckNAdd(int state)
-{
-   if (jjrounds[state] != jjround)
-   {
-      jjstateSet[jjnewStateCnt++] = state;
-      jjrounds[state] = jjround;
-   }
-}
-private void jjAddStates(int start, int end)
-{
-   do {
-      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
-   } while (start++ != end);
-}
-private void jjCheckNAddTwoStates(int state1, int state2)
-{
-   jjCheckNAdd(state1);
-   jjCheckNAdd(state2);
-}
-
-private void jjCheckNAddStates(int start, int end)
-{
-   do {
-      jjCheckNAdd(jjnextStates[start]);
-   } while (start++ != end);
-}
-
-}
+/**
+ * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Ikayzo and others - initial API and implementation
+ */
+/* Generated By:JavaCC: Do not edit this line. UnitParserTokenManager.java */
+package org.eclipse.uomo.units.impl.format;
+
+/** Token Manager. */
+class UnitParserTokenManager implements UnitParserConstants
+{
+
+  /** Debug output. */
+  java.io.PrintStream debugStream = System.out;
+  /** Set debug output. */
+  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
+//private final int jjStopStringLiteralDfa_0(int pos, long active0)
+//{
+//   switch (pos)
+//   {
+//      default :
+//         return -1;
+//   }
+//}
+//private final int jjStartNfa_0(int pos, long active0)
+//{
+//   return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
+//}
+private int jjStopAtPos(int pos, int kind)
+{
+   jjmatchedKind = kind;
+   jjmatchedPos = pos;
+   return pos + 1;
+}
+private int jjMoveStringLiteralDfa0_0()
+{
+   switch(curChar)
+   {
+      case 40:
+         return jjStopAtPos(0, 12);
+      case 41:
+         return jjStopAtPos(0, 13);
+      case 42:
+         return jjStopAtPos(0, 7);
+      case 43:
+         return jjStopAtPos(0, 5);
+      case 45:
+         return jjStopAtPos(0, 6);
+      case 47:
+         return jjStopAtPos(0, 9);
+      case 58:
+         return jjStopAtPos(0, 11);
+      case 94:
+         return jjStopAtPos(0, 10);
+      case 101:
+         return jjStartNfaWithStates_0(0, 19, 7);
+      case 183:
+         return jjStopAtPos(0, 8);
+      default :
+         return jjMoveNfa_0(6, 0);
+   }
+}
+private int jjStartNfaWithStates_0(int pos, int kind, int state)
+{
+   jjmatchedKind = kind;
+   jjmatchedPos = pos;
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) { return pos + 1; }
+   return jjMoveNfa_0(state, pos + 1);
+}
+static final long[] jjbitVec0 = {
+   0x0L, 0x0L, 0x20c000000000000L, 0x0L
+};
+static final long[] jjbitVec1 = {
+   0x0L, 0x3f1000000000000L, 0x0L, 0x0L
+};
+static final long[] jjbitVec2 = {
+   0xfffffffefffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
+};
+static final long[] jjbitVec4 = {
+   0x0L, 0x0L, 0xfd73ffffffffffffL, 0xffffffffffffffffL
+};
+static final long[] jjbitVec5 = {
+   0xffffffffffffffffL, 0xfc0effffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
+};
+private int jjMoveNfa_0(int startState, int curPos)
+{
+   int startsAt = 0;
+   jjnewStateCnt = 15;
+   int i = 1;
+   jjstateSet[0] = startState;
+   int kind = 0x7fffffff;
+   for (;;)
+   {
+      if (++jjround == 0x7fffffff)
+         ReInitRounds();
+      if (curChar < 64)
+      {
+         long l = 1L << curChar;
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 6:
+                  if ((0xf80010fe00000000L & l) != 0L)
+                  {
+                     if (kind > 20)
+                        kind = 20;
+                     jjCheckNAdd(7);
+                  }
+                  else if ((0x3ff000000000000L & l) != 0L)
+                  {
+                     if (kind > 14)
+                        kind = 14;
+                     jjCheckNAddStates(0, 4);
+                  }
+                  else if (curChar == 46)
+                     jjCheckNAdd(2);
+                  break;
+               case 1:
+                  if (curChar == 46)
+                     jjCheckNAdd(2);
+                  break;
+               case 2:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 16)
+                     kind = 16;
+                  jjCheckNAddTwoStates(2, 3);
+                  break;
+               case 4:
+                  if ((0x280000000000L & l) != 0L)
+                     jjCheckNAdd(5);
+                  break;
+               case 5:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 16)
+                     kind = 16;
+                  jjCheckNAdd(5);
+                  break;
+               case 7:
+                  if ((0xfbff10fe00000000L & l) == 0L)
+                     break;
+                  if (kind > 20)
+                     kind = 20;
+                  jjCheckNAdd(7);
+                  break;
+               case 8:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 14)
+                     kind = 14;
+                  jjCheckNAddStates(0, 4);
+                  break;
+               case 9:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 14)
+                     kind = 14;
+                  jjCheckNAdd(9);
+                  break;
+               case 10:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 16)
+                     kind = 16;
+                  jjCheckNAddStates(5, 8);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else if (curChar < 128)
+      {
+         long l = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 6:
+                  if ((0xffffffffbfffffffL & l) != 0L)
+                  {
+                     if (kind > 20)
+                        kind = 20;
+                     jjCheckNAdd(7);
+                  }
+                  if (curChar == 108)
+                     jjAddStates(9, 10);
+                  break;
+               case 3:
+                  if ((0x2000000020L & l) != 0L)
+                     jjAddStates(11, 12);
+                  break;
+               case 7:
+                  if ((0xffffffffbfffffffL & l) == 0L)
+                     break;
+                  if (kind > 20)
+                     kind = 20;
+                  jjCheckNAdd(7);
+                  break;
+               case 11:
+                  if (curChar == 108)
+                     jjAddStates(9, 10);
+                  break;
+               case 12:
+                  if (curChar == 111)
+                     jjstateSet[jjnewStateCnt++] = 13;
+                  break;
+               case 13:
+                  if (curChar == 103 && kind > 17)
+                     kind = 17;
+                  break;
+               case 14:
+                  if (curChar == 110 && kind > 18)
+                     kind = 18;
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else
+      {
+         int hiByte = (int)(curChar >> 8);
+         int i1 = hiByte >> 6;
+         long l1 = 1L << (hiByte & 077);
+         int i2 = (curChar & 0xff) >> 6;
+         long l2 = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 6:
+                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+                  {
+                     if (kind > 15)
+                        kind = 15;
+                     jjCheckNAdd(0);
+                  }
+                  if (jjCanMove_1(hiByte, i1, i2, l1, l2))
+                  {
+                     if (kind > 20)
+                        kind = 20;
+                     jjCheckNAdd(7);
+                  }
+                  break;
+               case 0:
+                  if (!jjCanMove_0(hiByte, i1, i2, l1, l2))
+                     break;
+                  if (kind > 15)
+                     kind = 15;
+                  jjCheckNAdd(0);
+                  break;
+               case 7:
+                  if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
+                     break;
+                  if (kind > 20)
+                     kind = 20;
+                  jjCheckNAdd(7);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      if (kind != 0x7fffffff)
+      {
+         jjmatchedKind = kind;
+         jjmatchedPos = curPos;
+         kind = 0x7fffffff;
+      }
+      ++curPos;
+      if ((i = jjnewStateCnt) == (startsAt = 15 - (jjnewStateCnt = startsAt)))
+         return curPos;
+      try { curChar = input_stream.readChar(); }
+      catch(java.io.IOException e) { return curPos; }
+   }
+}
+static final int[] jjnextStates = {
+   9, 1, 2, 3, 10, 1, 2, 3, 10, 12, 14, 4, 5,
+};
+private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
+{
+   switch(hiByte)
+   {
+      case 0:
+         return ((jjbitVec0[i2] & l2) != 0L);
+      case 32:
+         return ((jjbitVec1[i2] & l2) != 0L);
+      default :
+         return false;
+   }
+}
+private static final boolean jjCanMove_1(int hiByte, int i1, int i2, long l1, long l2)
+{
+   switch(hiByte)
+   {
+      case 0:
+         return ((jjbitVec4[i2] & l2) != 0L);
+      case 32:
+         return ((jjbitVec5[i2] & l2) != 0L);
+      default :
+         if ((jjbitVec2[i1] & l1) != 0L)
+            return true;
+         return false;
+   }
+}
+
+/** Token literal values. */
+private static final String[] jjstrLiteralImages = {
+"", null, null, null, null, "\53", "\55", "\52", "\267", "\57", "\136", "\72",
+"\50", "\51", null, null, null, null, null, "\145", null, };
+
+/** Lexer state names. */
+//private static final String[] lexStateNames = {
+//   "DEFAULT",
+//};
+protected SimpleCharStream input_stream;
+private final int[] jjrounds = new int[15];
+private final int[] jjstateSet = new int[30];
+protected char curChar;
+/** Constructor. */
+UnitParserTokenManager(SimpleCharStream stream){
+   if (SimpleCharStream.staticFlag)
+      throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
+   input_stream = stream;
+}
+
+/** Constructor. */
+UnitParserTokenManager(SimpleCharStream stream, int lexState){
+   this(stream);
+   switchTo(lexState);
+}
+
+/** Reinitialise parser. */
+void reInit(SimpleCharStream stream)
+{
+   jjmatchedPos = jjnewStateCnt = 0;
+   curLexState = defaultLexState;
+   input_stream = stream;
+   ReInitRounds();
+}
+private void ReInitRounds()
+{
+   int i;
+   jjround = 0x80000001;
+   for (i = 15; i-- > 0;)
+      jjrounds[i] = 0x80000000;
+}
+
+/** Reinitialise parser. */
+void reInit(SimpleCharStream stream, int lexState)
+{
+   reInit(stream);
+   switchTo(lexState);
+}
+
+/** Switch to specified lex state. */
+void switchTo(int lexState)
+{
+   if (lexState >= 1 || lexState < 0)
+      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
+   else
+      curLexState = lexState;
+}
+
+protected Token jjFillToken()
+{
+   final Token t;
+   final String curTokenImage;
+   final int beginLine;
+   final int endLine;
+   final int beginColumn;
+   final int endColumn;
+   String im = jjstrLiteralImages[jjmatchedKind];
+   curTokenImage = (im == null) ? input_stream.getImage() : im;
+   beginLine = input_stream.getBeginLine();
+   beginColumn = input_stream.getBeginColumn();
+   endLine = input_stream.getEndLine();
+   endColumn = input_stream.getEndColumn();
+   t = Token.newToken(jjmatchedKind, curTokenImage);
+
+   t.beginLine = beginLine;
+   t.endLine = endLine;
+   t.beginColumn = beginColumn;
+   t.endColumn = endColumn;
+
+   return t;
+}
+
+int curLexState = 0;
+int defaultLexState = 0;
+int jjnewStateCnt;
+int jjround;
+int jjmatchedPos;
+int jjmatchedKind;
+
+/** Get the next Token. */
+Token getNextToken()
+{
+  Token matchedToken;
+  int curPos = 0;
+
+//  EOFLoop :
+  for (;;)
+  {
+   try
+   {
+      curChar = input_stream.beginToken();
+   }
+   catch(java.io.IOException e)
+   {
+      jjmatchedKind = 0;
+      matchedToken = jjFillToken();
+      return matchedToken;
+   }
+
+   jjmatchedKind = 0x7fffffff;
+   jjmatchedPos = 0;
+   curPos = jjMoveStringLiteralDfa0_0();
+   if (jjmatchedKind != 0x7fffffff)
+   {
+      if (jjmatchedPos + 1 < curPos)
+         input_stream.backup(curPos - jjmatchedPos - 1);
+         matchedToken = jjFillToken();
+         return matchedToken;
+   }
+   int error_line = input_stream.getEndLine();
+   int error_column = input_stream.getEndColumn();
+   String error_after = null;
+   boolean EOFSeen = false;
+   try { input_stream.readChar(); input_stream.backup(1); }
+   catch (java.io.IOException e1) {
+      EOFSeen = true;
+      error_after = curPos <= 1 ? "" : input_stream.getImage();
+      if (curChar == '\n' || curChar == '\r') {
+         error_line++;
+         error_column = 0;
+      }
+      else
+         error_column++;
+   }
+   if (!EOFSeen) {
+      input_stream.backup(1);
+      error_after = curPos <= 1 ? "" : input_stream.getImage();
+   }
+   throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
+  }
+}
+
+private void jjCheckNAdd(int state)
+{
+   if (jjrounds[state] != jjround)
+   {
+      jjstateSet[jjnewStateCnt++] = state;
+      jjrounds[state] = jjround;
+   }
+}
+private void jjAddStates(int start, int end)
+{
+   do {
+      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
+   } while (start++ != end);
+}
+private void jjCheckNAddTwoStates(int state1, int state2)
+{
+   jjCheckNAdd(state1);
+   jjCheckNAdd(state2);
+}
+
+private void jjCheckNAddStates(int start, int end)
+{
+   do {
+      jjCheckNAdd(jjnextStates[start]);
+   } while (start++ != end);
+}
+
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricCapacitanceAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricCapacitanceAmount.java
index bc559c5..c2bac23 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricCapacitanceAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricCapacitanceAmount.java
@@ -1,30 +1,30 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Ikayzo and others - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.ElectricCapacitance;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents an electric capacitance.
- * The metric system unit for this quantity is "F" (Farad).
- * 
- * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.2, $Date: 2013-04-28 $
- */
-public final class ElectricCapacitanceAmount extends BaseQuantity<ElectricCapacitance> {
-
-	public ElectricCapacitanceAmount(Number number, Unit<ElectricCapacitance> unit) {
-		super(number, unit);
-	}
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Ikayzo and others - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.ElectricCapacitance;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents an electric capacitance.
+ * The metric system unit for this quantity is "F" (Farad).
+ * 
+ * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.2, $Date: 2013-04-28 $
+ */
+public final class ElectricCapacitanceAmount extends BaseQuantity<ElectricCapacitance> {
+
+	public ElectricCapacitanceAmount(Number number, Unit<ElectricCapacitance> unit) {
+		super(number, unit);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricChargeAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricChargeAmount.java
index 46d47db..9def76c 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricChargeAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricChargeAmount.java
@@ -1,30 +1,30 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Ikayzo and others - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.ElectricCharge;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents an electric charge.
- * The metric system unit for this quantity is "C" (Coulomb).
- * 
- * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.2, $Date: 2013-04-28 $
- */
-public final class ElectricChargeAmount extends BaseQuantity<ElectricCharge> {
-
-	public ElectricChargeAmount(Number number, Unit<ElectricCharge> unit) {
-		super(number, unit);
-	}
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Ikayzo and others - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.ElectricCharge;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents an electric charge.
+ * The metric system unit for this quantity is "C" (Coulomb).
+ * 
+ * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.2, $Date: 2013-04-28 $
+ */
+public final class ElectricChargeAmount extends BaseQuantity<ElectricCharge> {
+
+	public ElectricChargeAmount(Number number, Unit<ElectricCharge> unit) {
+		super(number, unit);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricConductanceAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricConductanceAmount.java
index 916f1d4..b4c4031 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricConductanceAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricConductanceAmount.java
@@ -1,30 +1,30 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.ElectricConductance;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents an electric conductance amount.
- * The metric system unit for this quantity "S" (Siemens).
- * 
- * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.2, $Date: 2013-05-11 $
- */
-public final class ElectricConductanceAmount extends BaseQuantity<ElectricConductance> {
-
-	public ElectricConductanceAmount(Number number, Unit<ElectricConductance> unit) {
-		super(number, unit);
-	}
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.ElectricConductance;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents an electric conductance amount.
+ * The metric system unit for this quantity "S" (Siemens).
+ * 
+ * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.2, $Date: 2013-05-11 $
+ */
+public final class ElectricConductanceAmount extends BaseQuantity<ElectricConductance> {
+
+	public ElectricConductanceAmount(Number number, Unit<ElectricConductance> unit) {
+		super(number, unit);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricCurrentAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricCurrentAmount.java
index 4feef22..c280079 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricCurrentAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricCurrentAmount.java
@@ -1,31 +1,31 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   Werner Keil, Jean-Marie Dautelle - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.ElectricCurrent;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents the amount of electric charge flowing past
- * a specified circuit point per unit time.
- * The metric system unit for this quantity is "A" (Ampere).
- * 
- * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.2, $Date: 2013-05-12 $
- */
-public final class ElectricCurrentAmount extends BaseQuantity<ElectricCurrent> {
-
-	public ElectricCurrentAmount(Number number, Unit<ElectricCurrent> unit) {
-		super(number, unit);
-	}
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Werner Keil, Jean-Marie Dautelle - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.ElectricCurrent;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents the amount of electric charge flowing past
+ * a specified circuit point per unit time.
+ * The metric system unit for this quantity is "A" (Ampere).
+ * 
+ * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.2, $Date: 2013-05-12 $
+ */
+public final class ElectricCurrentAmount extends BaseQuantity<ElectricCurrent> {
+
+	public ElectricCurrentAmount(Number number, Unit<ElectricCurrent> unit) {
+		super(number, unit);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricInductanceAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricInductanceAmount.java
index fd95729..853fb53 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricInductanceAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricInductanceAmount.java
@@ -1,30 +1,30 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.ElectricInductance;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents an electric inductance.
- * The metric system unit for this quantity is "H" (Henry).
- * 
- * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.2, ($Revision: 212 $), $Date: 2010-09-13 23:50:44 +0200 (Mo, 13 Sep 2010) $
- */
-public final class ElectricInductanceAmount extends BaseQuantity<ElectricInductance> {
-
-	public ElectricInductanceAmount(Number number, Unit<ElectricInductance> unit) {
-		super(number, unit);
-	}
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.ElectricInductance;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents an electric inductance.
+ * The metric system unit for this quantity is "H" (Henry).
+ * 
+ * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.2, ($Revision: 212 $), $Date: 2010-09-13 23:50:44 +0200 (Mo, 13 Sep 2010) $
+ */
+public final class ElectricInductanceAmount extends BaseQuantity<ElectricInductance> {
+
+	public ElectricInductanceAmount(Number number, Unit<ElectricInductance> unit) {
+		super(number, unit);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricPotentialAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricPotentialAmount.java
index 82c8342..bf994a7 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricPotentialAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricPotentialAmount.java
@@ -1,30 +1,30 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Ikayzo and others - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.ElectricPotential;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents an amount of electric potential or electromotive force.
- * The metric system unit for this quantity is "V" (Volt).
- * 
- * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.2, $Date: 2013-05-13 $
- */
-public final class ElectricPotentialAmount extends BaseQuantity<ElectricPotential> {
-
-	public ElectricPotentialAmount(Number number, Unit<ElectricPotential> unit) {
-		super(number, unit);
-	}
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Ikayzo and others - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.ElectricPotential;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents an amount of electric potential or electromotive force.
+ * The metric system unit for this quantity is "V" (Volt).
+ * 
+ * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.2, $Date: 2013-05-13 $
+ */
+public final class ElectricPotentialAmount extends BaseQuantity<ElectricPotential> {
+
+	public ElectricPotentialAmount(Number number, Unit<ElectricPotential> unit) {
+		super(number, unit);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricResistanceAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricResistanceAmount.java
index 64f83e7..819740a 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricResistanceAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ElectricResistanceAmount.java
@@ -1,30 +1,30 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil, and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Ikayzo and others - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.ElectricResistance;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents an electric resistance.
- * The metric system unit for this quantity is "Ohm" (Ω).
- * 
- * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.2, $Date: 2013-05-13 $
- */
-public final class ElectricResistanceAmount extends BaseQuantity<ElectricResistance> {
-
-	public ElectricResistanceAmount(Number number, Unit<ElectricResistance> unit) {
-		super(number, unit);
-	}
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil, and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Ikayzo and others - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.ElectricResistance;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents an electric resistance.
+ * The metric system unit for this quantity is "Ohm" (Ω).
+ * 
+ * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.2, $Date: 2013-05-13 $
+ */
+public final class ElectricResistanceAmount extends BaseQuantity<ElectricResistance> {
+
+	public ElectricResistanceAmount(Number number, Unit<ElectricResistance> unit) {
+		super(number, unit);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ForceAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ForceAmount.java
index cac9663..3d7864e 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ForceAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/ForceAmount.java
@@ -1,32 +1,32 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.Force;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents a quantity that tends to produce an acceleration of a body in the
- * direction of its application. The metric system unit for this quantity is "N"
- * (Newton).
- * 
- * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.3, $Date: 2013-05-21 $
- */
-public final class ForceAmount extends BaseQuantity<Force> implements Force {
-
-	public ForceAmount(Number number, Unit<Force> unit) {
-		super(number, unit);
-	}
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.Force;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents a quantity that tends to produce an acceleration of a body in the
+ * direction of its application. The metric system unit for this quantity is "N"
+ * (Newton).
+ * 
+ * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.3, $Date: 2013-05-21 $
+ */
+public final class ForceAmount extends BaseQuantity<Force> implements Force {
+
+	public ForceAmount(Number number, Unit<Force> unit) {
+		super(number, unit);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/InformationAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/InformationAmount.java
index 908e059..59a8912 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/InformationAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/InformationAmount.java
@@ -1,31 +1,31 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.Information;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents a measure of data amount. The metric system unit for this quantity
- * is "bit".
- * 
- * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.5, $Date: 2013-05-21 $
- */
-public final class InformationAmount extends BaseQuantity<Information> implements
-		Information {
-
-	public InformationAmount(Number number, Unit<Information> unit) {
-		super(number, unit);
-	}
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.Information;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents a measure of data amount. The metric system unit for this quantity
+ * is "bit".
+ * 
+ * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.5, $Date: 2013-05-21 $
+ */
+public final class InformationAmount extends BaseQuantity<Information> implements
+		Information {
+
+	public InformationAmount(Number number, Unit<Information> unit) {
+		super(number, unit);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/IonizingRadiationAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/IonizingRadiationAmount.java
index b73c9a5..ae31d3b 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/IonizingRadiationAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/IonizingRadiationAmount.java
@@ -1,31 +1,31 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.IonizingRadiation;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents the quantity of subatomic particles or electromagnetic waves that
- * are energetic enough to detach electrons from atoms or molecules, ionizing
- * them. The system unit for this quantity is "C/kg ("coulomb per kilogram).
- * 
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.1, $Date: 2013-05-21 $
- */
-public final class IonizingRadiationAmount extends BaseQuantity<IonizingRadiation>
-		implements IonizingRadiation {
-
-	public IonizingRadiationAmount(Number number, Unit<IonizingRadiation> unit) {
-		super(number, unit);
-	}
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.IonizingRadiation;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents the quantity of subatomic particles or electromagnetic waves that
+ * are energetic enough to detach electrons from atoms or molecules, ionizing
+ * them. The system unit for this quantity is "C/kg ("coulomb per kilogram).
+ * 
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.1, $Date: 2013-05-21 $
+ */
+public final class IonizingRadiationAmount extends BaseQuantity<IonizingRadiation>
+		implements IonizingRadiation {
+
+	public IonizingRadiationAmount(Number number, Unit<IonizingRadiation> unit) {
+		super(number, unit);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/LuminousFluxAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/LuminousFluxAmount.java
index cb7efbc..e522d30 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/LuminousFluxAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/LuminousFluxAmount.java
@@ -1,31 +1,31 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.LuminousFlux;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents a luminous flux. The metric system unit for this quantity is "lm"
- * (lumen).
- * 
- * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.2, $Date: 2013-05-21 $
- */
-public final class LuminousFluxAmount extends BaseQuantity<LuminousFlux>
-		implements LuminousFlux {
-
-	public LuminousFluxAmount(Number number, Unit<LuminousFlux> unit) {
-		super(number, unit);
-	}
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.LuminousFlux;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents a luminous flux. The metric system unit for this quantity is "lm"
+ * (lumen).
+ * 
+ * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.2, $Date: 2013-05-21 $
+ */
+public final class LuminousFluxAmount extends BaseQuantity<LuminousFlux>
+		implements LuminousFlux {
+
+	public LuminousFluxAmount(Number number, Unit<LuminousFlux> unit) {
+		super(number, unit);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/LuminousIntensityAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/LuminousIntensityAmount.java
index 18b3bfd..b5b114a 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/LuminousIntensityAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/LuminousIntensityAmount.java
@@ -1,32 +1,32 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.LuminousIntensity;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents the luminous flux density per solid angle as measured in a given
- * direction relative to the emitting source. The metric system unit for this
- * quantity is "cd" (candela).
- * 
- * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.2, $Date: 2013-05-21 $
- */
-public final class LuminousIntensityAmount extends
-		BaseQuantity<LuminousIntensity> implements LuminousIntensity {
-
-	public LuminousIntensityAmount(Number number, Unit<LuminousIntensity> unit) {
-		super(number, unit);
-	}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.LuminousIntensity;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents the luminous flux density per solid angle as measured in a given
+ * direction relative to the emitting source. The metric system unit for this
+ * quantity is "cd" (candela).
+ * 
+ * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.2, $Date: 2013-05-21 $
+ */
+public final class LuminousIntensityAmount extends
+		BaseQuantity<LuminousIntensity> implements LuminousIntensity {
+
+	public LuminousIntensityAmount(Number number, Unit<LuminousIntensity> unit) {
+		super(number, unit);
+	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/MagneticFluxAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/MagneticFluxAmount.java
index 45433f4..0c58832 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/MagneticFluxAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/MagneticFluxAmount.java
@@ -1,31 +1,31 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.MagneticFlux;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents a magnetic flux. The metric system unit for this quantity is "Wb"
- * (Weber).
- * 
- * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.2, $Date: 2010-05-21 $
- */
-public class MagneticFluxAmount extends BaseQuantity<MagneticFlux> implements
-		MagneticFlux {
-
-	public MagneticFluxAmount(Number number, Unit<MagneticFlux> unit) {
-		super(number, unit);
-	}
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.MagneticFlux;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents a magnetic flux. The metric system unit for this quantity is "Wb"
+ * (Weber).
+ * 
+ * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.2, $Date: 2010-05-21 $
+ */
+public class MagneticFluxAmount extends BaseQuantity<MagneticFlux> implements
+		MagneticFlux {
+
+	public MagneticFluxAmount(Number number, Unit<MagneticFlux> unit) {
+		super(number, unit);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/MagneticFluxDensityAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/MagneticFluxDensityAmount.java
index ef4352e..94019c5 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/MagneticFluxDensityAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/MagneticFluxDensityAmount.java
@@ -1,32 +1,32 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.MagneticFluxDensity;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents a magnetic flux density. The metric system unit for this quantity
- * is "T" (Tesla).
- * 
- * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.2, $Date: 2013-05-21 $
- */
-public class MagneticFluxDensityAmount extends BaseQuantity<MagneticFluxDensity>
-		implements MagneticFluxDensity {
-
-	public MagneticFluxDensityAmount(Number number,
-			Unit<MagneticFluxDensity> unit) {
-		super(number, unit);
-	}
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.MagneticFluxDensity;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents a magnetic flux density. The metric system unit for this quantity
+ * is "T" (Tesla).
+ * 
+ * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.2, $Date: 2013-05-21 $
+ */
+public class MagneticFluxDensityAmount extends BaseQuantity<MagneticFluxDensity>
+		implements MagneticFluxDensity {
+
+	public MagneticFluxDensityAmount(Number number,
+			Unit<MagneticFluxDensity> unit) {
+		super(number, unit);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/MagnetomotiveForceAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/MagnetomotiveForceAmount.java
index e27fe73..8047781 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/MagnetomotiveForceAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/MagnetomotiveForceAmount.java
@@ -1,33 +1,33 @@
-/**
- * Copyright (c) 2005, 2014, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.MagnetomotiveForce;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents an amount of force that produces magnetic flux. The metric system
- * unit for this quantity is "At" (ampere-turn).
- * 
- * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.5, $Date: 2013-05-21 $
- * @see <a href="http://en.wikipedia.org/wiki/Magnetomotive_force">Wikipedia's
- *      Magnetomotive Force</a>
- */
-public final class MagnetomotiveForceAmount extends
-		BaseQuantity<MagnetomotiveForce> implements MagnetomotiveForce {
-
-	public MagnetomotiveForceAmount(Number number, Unit<MagnetomotiveForce> unit) {
-		super(number, unit);
-	}
-}
+/**
+ * Copyright (c) 2005, 2014, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.MagnetomotiveForce;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents an amount of force that produces magnetic flux. The metric system
+ * unit for this quantity is "At" (ampere-turn).
+ * 
+ * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.5, $Date: 2013-05-21 $
+ * @see <a href="http://en.wikipedia.org/wiki/Magnetomotive_force">Wikipedia's
+ *      Magnetomotive Force</a>
+ */
+public final class MagnetomotiveForceAmount extends
+		BaseQuantity<MagnetomotiveForce> implements MagnetomotiveForce {
+
+	public MagnetomotiveForceAmount(Number number, Unit<MagnetomotiveForce> unit) {
+		super(number, unit);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/PowerAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/PowerAmount.java
index 62c267c..bc4179b 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/PowerAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/PowerAmount.java
@@ -1,30 +1,30 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.Power;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents the rate at which work is done.
- * The metric system unit for this quantity is "W" (Watt).
- *
- * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.2, $Date: 2013-05-21 $
- */
-public final class PowerAmount extends BaseQuantity<Power> implements Power {
-
-	public PowerAmount(Number number,Unit<Power> unit) {
-		super(number, unit);
-	}
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Jean-Marie Dautelle - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.Power;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents the rate at which work is done.
+ * The metric system unit for this quantity is "W" (Watt).
+ *
+ * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.2, $Date: 2013-05-21 $
+ */
+public final class PowerAmount extends BaseQuantity<Power> implements Power {
+
+	public PowerAmount(Number number,Unit<Power> unit) {
+		super(number, unit);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/RadiationDoseAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/RadiationDoseAmount.java
index 1f39f75..47ce199 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/RadiationDoseAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/RadiationDoseAmount.java
@@ -1,30 +1,30 @@
-/**
- * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Ikayzo and others - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.RadiationDoseAbsorbed;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents the amount of energy deposited per unit of mass.
- * The system unit for this quantity is "Gy" (Gray).
- * 
- * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.2, ($Revision: 212 $), $Date: 2010-09-13 23:50:44 +0200 (Mo, 13 Sep 2010) $
- */
-public class RadiationDoseAmount extends BaseQuantity<RadiationDoseAbsorbed> {
-
-	public RadiationDoseAmount(Number number, Unit<RadiationDoseAbsorbed> unit) {
-		super(number, unit);
-	}
-}
+/**
+ * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Ikayzo and others - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.RadiationDoseAbsorbed;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents the amount of energy deposited per unit of mass.
+ * The system unit for this quantity is "Gy" (Gray).
+ * 
+ * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.2, ($Revision: 212 $), $Date: 2010-09-13 23:50:44 +0200 (Mo, 13 Sep 2010) $
+ */
+public class RadiationDoseAmount extends BaseQuantity<RadiationDoseAbsorbed> {
+
+	public RadiationDoseAmount(Number number, Unit<RadiationDoseAbsorbed> unit) {
+		super(number, unit);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/RadiationDoseEffectiveAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/RadiationDoseEffectiveAmount.java
index 890282f..24713cb 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/RadiationDoseEffectiveAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/RadiationDoseEffectiveAmount.java
@@ -1,31 +1,31 @@
-/**
- * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Ikayzo and others - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.RadiationDoseEffective;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents the effective (or "equivalent") dose of radiation
- * received by a human or some other living organism.
- * The metric system unit for this quantity is "Sv" (Sievert).
- * 
- * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.3 ($Revision: 212 $), $Date: 2010-09-13 23:50:44 +0200 (Mo, 13 Sep 2010) $
- */
-public class RadiationDoseEffectiveAmount extends BaseQuantity<RadiationDoseEffective> {
-
-	public RadiationDoseEffectiveAmount(Number number, Unit<RadiationDoseEffective> unit) {
-		super(number, unit);
-	}
-}
+/**
+ * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Ikayzo and others - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.RadiationDoseEffective;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents the effective (or "equivalent") dose of radiation
+ * received by a human or some other living organism.
+ * The metric system unit for this quantity is "Sv" (Sievert).
+ * 
+ * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.3 ($Revision: 212 $), $Date: 2010-09-13 23:50:44 +0200 (Mo, 13 Sep 2010) $
+ */
+public class RadiationDoseEffectiveAmount extends BaseQuantity<RadiationDoseEffective> {
+
+	public RadiationDoseEffectiveAmount(Number number, Unit<RadiationDoseEffective> unit) {
+		super(number, unit);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/RadioactivityAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/RadioactivityAmount.java
index dc9d555..9c1579b 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/RadioactivityAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/RadioactivityAmount.java
@@ -1,31 +1,31 @@
-/**
- * Copyright (c) 2005, 2014, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Ikayzo and others - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.RadioactiveActivity;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents radioactivity. The metric system unit for this quantity is "Bq"
- * (Becquerel).
- * 
- * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.2, $Date: 2014-03-03 $
- */
-public class RadioactivityAmount extends BaseQuantity<RadioactiveActivity>
-		implements RadioactiveActivity {
-
-	public RadioactivityAmount(Number number, Unit<RadioactiveActivity> unit) {
-		super(number, unit);
-	}
-}
+/**
+ * Copyright (c) 2005, 2014, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Ikayzo and others - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.RadioactiveActivity;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents radioactivity. The metric system unit for this quantity is "Bq"
+ * (Becquerel).
+ * 
+ * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.2, $Date: 2014-03-03 $
+ */
+public class RadioactivityAmount extends BaseQuantity<RadioactiveActivity>
+		implements RadioactiveActivity {
+
+	public RadioactivityAmount(Number number, Unit<RadioactiveActivity> unit) {
+		super(number, unit);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/SubstanceAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/SubstanceAmount.java
index c34e743..7e2f6d7 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/SubstanceAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/SubstanceAmount.java
@@ -1,30 +1,30 @@
-/**
- * Copyright (c) 2005, 2010, Werner Keil, JScience and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.unitsofmeasurement.quantity.AmountOfSubstance;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * Represents the number of elementary entities (molecules, for example) of a substance.
- * The metric system unit for this quantity is "mol" (mole).
- *
- * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.4 ($Revision: 212 $), $Date: 2010-09-13 23:50:44 +0200 (Mo, 13 Sep 2010) $
- */
-public class SubstanceAmount extends BaseQuantity<AmountOfSubstance> {
-	
-	public SubstanceAmount(Number number, Unit<AmountOfSubstance> unit) {
-		super(number, unit);
-	}
-}
+/**
+ * Copyright (c) 2005, 2010, Werner Keil, JScience and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.unitsofmeasurement.quantity.AmountOfSubstance;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * Represents the number of elementary entities (molecules, for example) of a substance.
+ * The metric system unit for this quantity is "mol" (mole).
+ *
+ * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.4 ($Revision: 212 $), $Date: 2010-09-13 23:50:44 +0200 (Mo, 13 Sep 2010) $
+ */
+public class SubstanceAmount extends BaseQuantity<AmountOfSubstance> {
+	
+	public SubstanceAmount(Number number, Unit<AmountOfSubstance> unit) {
+		super(number, unit);
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/TimeAmount.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/TimeAmount.java
index 102cfb3..817e87a 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/TimeAmount.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/quantity/TimeAmount.java
@@ -1,186 +1,186 @@
-/**
- * Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Ikayzo and others - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.quantity;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.math.MathContext;
-
-import org.eclipse.uomo.units.AbstractConverter;
-import org.eclipse.uomo.units.AbstractUnit;
-import org.eclipse.uomo.units.IMeasure;
-import org.eclipse.uomo.units.impl.BaseQuantity;
-import org.eclipse.uomo.units.impl.converter.RationalConverter;
-import org.unitsofmeasurement.quantity.Time;
-import org.unitsofmeasurement.unit.IncommensurableException;
-import org.unitsofmeasurement.unit.UnconvertibleException;
-import org.unitsofmeasurement.unit.Unit;
-import org.unitsofmeasurement.unit.UnitConverter;
-
-/**
- * Represents a period of existence or persistence. The metric system unit for
- * this quantity is "s" (second).
- * 
- * Due to an incompatible private constructor in ICU4J TimeUnit, this uses BaseUnit.
- * TODO add conversions with ICU4J TimeUnitAmount where necessary
- * 
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.6 ($Revision: 212 $), $Date: 2010-09-13 23:50:44 +0200 (Mo, 13 Sep 2010) $
- */
-public final class TimeAmount extends BaseQuantity<Time> implements Time {
-
-	public TimeAmount(Number number, Unit<Time> unit) {
-		super(number, unit);
-	}
-
-	/**
-	 * Get the unit (convenience to avoid cast).
-	 * 
-	 * @draft UOMo 0.5
-	 * @provisional This API might change or be removed in a future release.
-	 */
-	public AbstractUnit<Time> unit() {
-		return (AbstractUnit<Time>) super.unit();
-	}
-
-	/**
-	 * Returns the value of this quantity as <code>double</code> stated in the
-	 * specified unit. This method is recommended over <code>
-	 * q.getUnit().getConverterTo(unit).convert(q.getNumber()).doubleValue()</code>
-	 * 
-	 * @param unit
-	 *            the unit in which the returned value is stated.
-	 * @return the value of this quantity when stated in the specified unit.
-	 */
-	public double doubleValue(Unit<Time> unit) {
-		Unit<Time> myUnit = unit();
-		try {
-			UnitConverter converter = unit.getConverterToAny(myUnit);
-			return converter.convert(getValue().doubleValue());
-		} catch (UnconvertibleException e) {
-			throw e;
-		} catch (IncommensurableException e) {
-			throw new IllegalArgumentException(e.getMessage());
-		}
-	}
-
-	/**
-	 * Returns the value of this quantity as <code>long</code> stated in the
-	 * specified unit. This method is recommended over <code>
-	 * q.getUnit().getConverterTo(unit).convert(q.getNumber()).longValue()</code>
-	 * 
-	 * @param unit
-	 *            the unit in which the returned value is stated.
-	 * @return the value of this quantity when stated in the specified unit.
-	 */
-	public long longValue(Unit<Time> unit) {
-		Unit<Time> myUnit = unit();
-		try {
-			UnitConverter converter = unit.getConverterToAny(myUnit);
-			return (converter.convert(
-					BigDecimal.valueOf(getValue().longValue()),
-					MathContext.DECIMAL128)).longValue();
-		} catch (UnconvertibleException e) {
-			throw e;
-		} catch (IncommensurableException e) {
-			throw new IllegalArgumentException(e.getMessage());
-		}
-	}
-
-	public TimeAmount add(IMeasure<Time> that) {
-		return new TimeAmount(super.getValue().doubleValue()
-				+ ((BaseQuantity<Time>) that).getValue().doubleValue(),
-				that.unit());
-	}
-
-	public TimeAmount subtract(IMeasure<Time> that) {
-		return new TimeAmount(super.getValue().doubleValue()
-				- ((BaseQuantity<Time>) that).getValue().doubleValue(),
-				that.unit());
-	}
-	
-//	public IMeasure<Time> divide(IMeasure<?> that) {
-//		@SuppressWarnings("unchecked")
-//		Unit<Time> unit = (Unit<Time>) unit().divide(that.unit());
-		
-		// FIXME include number division
-//		return new TimeAmount((BigDecimal) getNumber())
-//				.divide((BigDecimal) ((Measure)that).getNumber()), unit);
-//		return new TimeAmount(getNumber(), unit);
-//	}
-
-	@SuppressWarnings({ "unchecked" })
-	public TimeAmount multiply(IMeasure<?> that) {
-		Unit<Time> unit = (Unit<Time>) unit().multiply(that.unit());
-		
-		// FIXME include number division
-//		return new TimeAmount((BigDecimal) getNumber())
-//				.divide((BigDecimal) ((Measure)that).getNumber()), unit);
-		return new TimeAmount(getValue(), unit);
-	}
-
-	/**
-	 * Returns the amount corresponding to the specified value
-	 * and unit.
-	 * 
-	 * @param value
-	 *            the value stated in the specified unit.
-	 * @param unit
-	 *            the unit in which the value is stated.
-	 * @return the corresponding amount.
-	 */
-	public static TimeAmount valueOf(Number value, AbstractUnit<Time> unit) {
-		TimeAmount amount = new TimeAmount(value, unit);
-		return amount;
-	}
-	
-	public TimeAmount to(Unit<Time> unit) {
-		return to(unit, MathContext.DECIMAL32);
-	}
-	
-	public TimeAmount to(Unit<Time> unit, MathContext ctx) {
-        if (this.unit().equals(unit))
-            return this;
-        UnitConverter cvtr = this.unit().getConverterTo(unit);
-        if (cvtr == AbstractConverter.IDENTITY)
-            return (TimeAmount) of(this.getValue().intValue(), unit);
-        return (TimeAmount) of(convert(this.getValue(), cvtr, ctx).intValue(), unit);
-    }
-
-    // Try to convert the specified value.
-    private static Number convert(Number value, UnitConverter cvtr, MathContext ctx) {
-        if (cvtr instanceof RationalConverter) { // Try converting through Field methods.
-            RationalConverter rCvtr = (RationalConverter) cvtr;
-            BigInteger dividend = rCvtr.getDividend();
-            BigInteger divisor = rCvtr.getDivisor();
-            if (dividend.abs().compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0)
-                throw new ArithmeticException("Multiplier overflow");
-            if (divisor.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0)
-                throw new ArithmeticException("Divisor overflow");
-            return (value.longValue() * dividend.longValue()) / (divisor.longValue());
-        } else if (cvtr instanceof AbstractConverter.Compound && cvtr.isLinear()) { // Do it in two parts.
-            AbstractConverter.Compound compound = (AbstractConverter.Compound) cvtr;
-            Number firstConversion = convert(value, compound.getRight(), ctx);
-            Number secondConversion = convert(firstConversion, compound.getLeft(), ctx);
-            return secondConversion;
-        } else { // Try using BigDecimal as intermediate.
-            BigDecimal decimalValue = BigDecimal.valueOf(value.doubleValue());
-            BigDecimal newValue = cvtr.convert(decimalValue, ctx);
-            return newValue;
-//            if (((FieldNumber)value) instanceof Decimal)
-//                return (N)((FieldNumber)Decimal.valueOf(newValue));
-//            if (((FieldNumber)value) instanceof Float64)
-//                return (N)((FieldNumber)Float64.valueOf(newValue.doubleValue()));
-//            throw new ArithmeticException(
-//                    "Generic amount conversion not implemented for amount of type " + value.getClass());
-        }
-    }
-}
+/**
+ * Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Ikayzo and others - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.quantity;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.math.MathContext;
+
+import org.eclipse.uomo.units.AbstractConverter;
+import org.eclipse.uomo.units.AbstractUnit;
+import org.eclipse.uomo.units.IMeasure;
+import org.eclipse.uomo.units.impl.BaseQuantity;
+import org.eclipse.uomo.units.impl.converter.RationalConverter;
+import org.unitsofmeasurement.quantity.Time;
+import org.unitsofmeasurement.unit.IncommensurableException;
+import org.unitsofmeasurement.unit.UnconvertibleException;
+import org.unitsofmeasurement.unit.Unit;
+import org.unitsofmeasurement.unit.UnitConverter;
+
+/**
+ * Represents a period of existence or persistence. The metric system unit for
+ * this quantity is "s" (second).
+ * 
+ * Due to an incompatible private constructor in ICU4J TimeUnit, this uses BaseUnit.
+ * TODO add conversions with ICU4J TimeUnitAmount where necessary
+ * 
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.6 ($Revision: 212 $), $Date: 2010-09-13 23:50:44 +0200 (Mo, 13 Sep 2010) $
+ */
+public final class TimeAmount extends BaseQuantity<Time> implements Time {
+
+	public TimeAmount(Number number, Unit<Time> unit) {
+		super(number, unit);
+	}
+
+	/**
+	 * Get the unit (convenience to avoid cast).
+	 * 
+	 * @draft UOMo 0.5
+	 * @provisional This API might change or be removed in a future release.
+	 */
+	public AbstractUnit<Time> unit() {
+		return (AbstractUnit<Time>) super.unit();
+	}
+
+	/**
+	 * Returns the value of this quantity as <code>double</code> stated in the
+	 * specified unit. This method is recommended over <code>
+	 * q.getUnit().getConverterTo(unit).convert(q.getNumber()).doubleValue()</code>
+	 * 
+	 * @param unit
+	 *            the unit in which the returned value is stated.
+	 * @return the value of this quantity when stated in the specified unit.
+	 */
+	public double doubleValue(Unit<Time> unit) {
+		Unit<Time> myUnit = unit();
+		try {
+			UnitConverter converter = unit.getConverterToAny(myUnit);
+			return converter.convert(getValue().doubleValue());
+		} catch (UnconvertibleException e) {
+			throw e;
+		} catch (IncommensurableException e) {
+			throw new IllegalArgumentException(e.getMessage());
+		}
+	}
+
+	/**
+	 * Returns the value of this quantity as <code>long</code> stated in the
+	 * specified unit. This method is recommended over <code>
+	 * q.getUnit().getConverterTo(unit).convert(q.getNumber()).longValue()</code>
+	 * 
+	 * @param unit
+	 *            the unit in which the returned value is stated.
+	 * @return the value of this quantity when stated in the specified unit.
+	 */
+	public long longValue(Unit<Time> unit) {
+		Unit<Time> myUnit = unit();
+		try {
+			UnitConverter converter = unit.getConverterToAny(myUnit);
+			return (converter.convert(
+					BigDecimal.valueOf(getValue().longValue()),
+					MathContext.DECIMAL128)).longValue();
+		} catch (UnconvertibleException e) {
+			throw e;
+		} catch (IncommensurableException e) {
+			throw new IllegalArgumentException(e.getMessage());
+		}
+	}
+
+	public TimeAmount add(IMeasure<Time> that) {
+		return new TimeAmount(super.getValue().doubleValue()
+				+ ((BaseQuantity<Time>) that).getValue().doubleValue(),
+				that.unit());
+	}
+
+	public TimeAmount subtract(IMeasure<Time> that) {
+		return new TimeAmount(super.getValue().doubleValue()
+				- ((BaseQuantity<Time>) that).getValue().doubleValue(),
+				that.unit());
+	}
+	
+//	public IMeasure<Time> divide(IMeasure<?> that) {
+//		@SuppressWarnings("unchecked")
+//		Unit<Time> unit = (Unit<Time>) unit().divide(that.unit());
+		
+		// FIXME include number division
+//		return new TimeAmount((BigDecimal) getNumber())
+//				.divide((BigDecimal) ((Measure)that).getNumber()), unit);
+//		return new TimeAmount(getNumber(), unit);
+//	}
+
+	@SuppressWarnings({ "unchecked" })
+	public TimeAmount multiply(IMeasure<?> that) {
+		Unit<Time> unit = (Unit<Time>) unit().multiply(that.unit());
+		
+		// FIXME include number division
+//		return new TimeAmount((BigDecimal) getNumber())
+//				.divide((BigDecimal) ((Measure)that).getNumber()), unit);
+		return new TimeAmount(getValue(), unit);
+	}
+
+	/**
+	 * Returns the amount corresponding to the specified value
+	 * and unit.
+	 * 
+	 * @param value
+	 *            the value stated in the specified unit.
+	 * @param unit
+	 *            the unit in which the value is stated.
+	 * @return the corresponding amount.
+	 */
+	public static TimeAmount valueOf(Number value, AbstractUnit<Time> unit) {
+		TimeAmount amount = new TimeAmount(value, unit);
+		return amount;
+	}
+	
+	public TimeAmount to(Unit<Time> unit) {
+		return to(unit, MathContext.DECIMAL32);
+	}
+	
+	public TimeAmount to(Unit<Time> unit, MathContext ctx) {
+        if (this.unit().equals(unit))
+            return this;
+        UnitConverter cvtr = this.unit().getConverterTo(unit);
+        if (cvtr == AbstractConverter.IDENTITY)
+            return (TimeAmount) of(this.getValue().intValue(), unit);
+        return (TimeAmount) of(convert(this.getValue(), cvtr, ctx).intValue(), unit);
+    }
+
+    // Try to convert the specified value.
+    private static Number convert(Number value, UnitConverter cvtr, MathContext ctx) {
+        if (cvtr instanceof RationalConverter) { // Try converting through Field methods.
+            RationalConverter rCvtr = (RationalConverter) cvtr;
+            BigInteger dividend = rCvtr.getDividend();
+            BigInteger divisor = rCvtr.getDivisor();
+            if (dividend.abs().compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0)
+                throw new ArithmeticException("Multiplier overflow");
+            if (divisor.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0)
+                throw new ArithmeticException("Divisor overflow");
+            return (value.longValue() * dividend.longValue()) / (divisor.longValue());
+        } else if (cvtr instanceof AbstractConverter.Compound && cvtr.isLinear()) { // Do it in two parts.
+            AbstractConverter.Compound compound = (AbstractConverter.Compound) cvtr;
+            Number firstConversion = convert(value, compound.getRight(), ctx);
+            Number secondConversion = convert(firstConversion, compound.getLeft(), ctx);
+            return secondConversion;
+        } else { // Try using BigDecimal as intermediate.
+            BigDecimal decimalValue = BigDecimal.valueOf(value.doubleValue());
+            BigDecimal newValue = cvtr.convert(decimalValue, ctx);
+            return newValue;
+//            if (((FieldNumber)value) instanceof Decimal)
+//                return (N)((FieldNumber)Decimal.valueOf(newValue));
+//            if (((FieldNumber)value) instanceof Float64)
+//                return (N)((FieldNumber)Float64.valueOf(newValue.doubleValue()));
+//            throw new ArithmeticException(
+//                    "Generic amount conversion not implemented for amount of type " + value.getClass());
+        }
+    }
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/system/Imperial.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/system/Imperial.java
index af6db53..0d41545 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/system/Imperial.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/system/Imperial.java
@@ -1,254 +1,254 @@
-/**
- * Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Ikayzo and others - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.system;
-
-
-import static org.eclipse.uomo.units.SI.*;
-import static org.eclipse.uomo.units.SI.Prefix.MICRO;
-import static org.eclipse.uomo.units.internal.NonSI.AVOIRDUPOIS_POUND_DIVIDEND;
-import static org.eclipse.uomo.units.internal.NonSI.AVOIRDUPOIS_POUND_DIVISOR;
-
-import org.eclipse.uomo.units.AbstractSystemOfUnits;
-import org.unitsofmeasurement.quantity.Area;
-import org.unitsofmeasurement.quantity.Length;
-import org.unitsofmeasurement.quantity.Mass;
-import org.unitsofmeasurement.quantity.Temperature;
-import org.unitsofmeasurement.quantity.Time;
-import org.unitsofmeasurement.quantity.Volume;
-import org.unitsofmeasurement.unit.SystemOfUnits;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * <p>
- * This class contains units from the Imperial system.
- * </p>
- * <p>
- * 
- * @noextend This class is not intended to be extended by clients.
- * 
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.1 ($Revision: 332 $), $Date: 2011-09-11 14:52:11 +0200 $
- * @see <a
- *      href="http://en.wikipedia.org/wiki/http://en.wikipedia.org/wiki/Imperial_unit">Wikipedia:
- *      Imperial Units</a>
- */
-public final class Imperial extends AbstractSystemOfUnits  {
-
-	/**
-	 * Default constructor (prevents this class from being instantiated).
-	 */
-	private Imperial() {
-	}
-
-	/**
-	 * Returns the unique instance of this class.
-	 * 
-	 * @return the Imperial instance.
-	 */
-	public static SystemOfUnits getInstance() {
-		return INSTANCE;
-	}
-
-	private static final Imperial INSTANCE = new Imperial();
-
-	// //////////
-	// Length //
-	// //////////
-
-	/**
-	 * A unit of length equal to <code>0.0254 m</code> (standard name
-	 * <code>in</code>).
-	 */
-	public static final Unit<Length> INCH = USCustomary.INCH;
-	
-	// ////////
-	// Mass //
-	// ////////
-
-	/**
-	 * A unit of mass equal to <code>453.59237 grams</code> (avoirdupois pound,
-	 * standard name <code>lb</code>).
-	 */
-	static final Unit<Mass> POUND = addUnit(KILOGRAM.multiply(
-			AVOIRDUPOIS_POUND_DIVIDEND).divide(AVOIRDUPOIS_POUND_DIVISOR));
-
-	/**
-	 * A unit of mass equal to <code>1 / 16 {@link #POUND}</code> (standard name
-	 * <code>oz</code>).
-	 */
-	public static final Unit<Mass> OUNCE = addUnit(POUND.divide(16));
-	
-	/**
-	 * A unit of mass equal to <code>2240 {@link #POUND}</code> (long ton,
-	 * standard name <code>ton_uk</code>).
-	 */
-	public static final Unit<Mass> TON_UK = addUnit(POUND.multiply(2240));
-
-	/**
-	 * A unit of mass equal to <code>1000 kg</code> (metric ton, standard name
-	 * <code>t</code>).
-	 */
-	public static final Unit<Mass> METRIC_TON = addUnit(KILOGRAM.multiply(1000));
-
-	// ///////////////
-	// Temperature //
-	// ///////////////
-
-	/**
-	 * A unit of temperature equal to <code>5/9 °K</code> (standard name
-	 * <code>°R</code>).
-	 */
-	static final Unit<Temperature> RANKINE = addUnit(KELVIN.multiply(5)
-			.divide(9));
-
-	/**
-	 * A unit of temperature equal to degree Rankine minus
-	 * <code>459.67 °R</code> (standard name <code>°F</code>).
-	 * 
-	 * @see #RANKINE
-	 */
-	static final Unit<Temperature> FAHRENHEIT = addUnit(RANKINE
-			.add(459.67));
-
-	// /////////
-	// Angle //
-	// /////////
-
-	
-	// ////////////
-	// TimeUnit //
-	// ////////////
-	/**
-	 * A unit of time equal to <code>60 s</code> (standard name <code>min</code>
-	 * ).
-	 */
-	static final Unit<Time> MINUTE = addUnit(SECOND.multiply(60));
-
-	/**
-	 * A unit of duration equal to <code>60 {@link #MINUTE}</code> (standard
-	 * name <code>h</code>).
-	 */
-	static final Unit<Time> HOUR = addUnit(MINUTE.multiply(60));
-
-	// ////////////
-	// Velocity //
-	// ////////////
-
-
-	// ////////
-	// Area //
-	// ////////
-
-	/**
-	 * A unit of area (standard name <code>sft</code>
-	 * ).
-	 */
-	public static final Unit<Area> SQUARE_FOOT = USCustomary.SQUARE_FOOT;
-	
-	/**
-	 * One acre is 43,560 <code>square feet</code> (standard name <code>a</code>
-	 * ).
-	 */
-	public static final Unit<Area> ACRE = addUnit(SQUARE_FOOT.multiply(43560));
-
-	// ///////////////
-	// Data Amount //
-	// ///////////////
-	
-
-	// //////////
-	// Energy //
-	// //////////
-
-
-	// //////////
-	// Volume //
-	// //////////
-	/**
-	 * A unit of volume equal to one cubic decimeter (default label
-	 * <code>L</code>, also recognized <code>ÂµL, mL, cL, dL</code>).
-	 */
-	static final Unit<Volume> LITRE = addUnit(CUBIC_METRE.divide(1000));
-
-	/**
-	 * A unit of volume equal to one cubic inch (<code>in³</code>).
-	 */
-	static final Unit<Volume> CUBIC_INCH = addUnit(INCH.pow(3).asType(
-			Volume.class));
-
-	/**
-	 * A unit of volume equal to <code>4.546 09 {@link #LITRE}</code> (standard
-	 * name <code>gal_uk</code>).
-	 */
-	public static final Unit<Volume> GALLON_UK = addUnit(LITRE.multiply(454609)
-			.divide(100000));
-
-	/**
-	 * A unit of volume equal to one UK gallon, Liquid Unit.
-	 */
-	public static final Unit<Volume> GALLON_LIQUID = addUnit(CUBIC_INCH
-			.multiply(277.42));
-	
-	/**
-	 * A unit of volume equal to <code>1 / 160 {@link #GALLON_UK}</code>
-	 * (standard name <code>oz_fl_uk</code>).
-	 */
-	static final Unit<Volume> OUNCE_LIQUID_UK = addUnit(GALLON_UK
-			.divide(160));
-	
-	/**
-	 * A unit of volume equal to <code>1 / 160 {@link #GALLON_LIQUID}</code>
-	 * (standard name <code>oz_fl</code>).
-	 */
-	public static final Unit<Volume> OUNCE_LIQUID = OUNCE_LIQUID_UK;
-
-	/**
-	 * A unit of volume equal to <code>5 {@link #OUNCE_LIQUID}</code> (standard name
-	 * <code>gi</code>).
-	 */
-	public static final Unit<Volume> GILL = addUnit(OUNCE_LIQUID.multiply(5));
-
-	/**
-	 * A unit of volume equal to <code>20 {@link #OUNCE_LIQUID}</code> (standard name
-	 * <code>pt</code>).
-	 */
-	public static final Unit<Volume> PINT = addUnit(OUNCE_LIQUID.multiply(20));
-
-	/**
-	 * A unit of volume equal to <code>40 {@link #OUNCE_LIQUID}</code> (standard name
-	 * <code>qt</code>).
-	 */
-	public static final Unit<Volume> QUART = addUnit(OUNCE_LIQUID.multiply(40));
-	
-	/**
-	 * A unit of volume <code>~ 1 drop or 0.95 grain of water </code> (standard
-	 * name <code>min</code>).
-	 */
-	public static final Unit<Volume> MINIM = addUnit(MICRO(LITRE).multiply(
-			59.1938802d));
-
-	/**
-	 * A unit of volume equal to <code>20 {@link #MINIM}</code> (standard name
-	 * <code>fl scr</code>).
-	 */
-	public static final Unit<Volume> FLUID_SCRUPLE = addUnit(MINIM.multiply(60));
-
-	/**
-	 * A unit of volume equal to <code>3 {@link #FLUID_SCRUPLE}</code> (standard name
-	 * <code>fl drc</code>).
-	 */
-	public static final Unit<Volume> FLUID_DRACHM = addUnit(FLUID_SCRUPLE.multiply(3));
-
-
-	public String getName() {
-		return getClass().getSimpleName();
-	}
-}
+/**
+ * Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Ikayzo and others - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.system;
+
+
+import static org.eclipse.uomo.units.SI.*;
+import static org.eclipse.uomo.units.SI.Prefix.MICRO;
+import static org.eclipse.uomo.units.internal.NonSI.AVOIRDUPOIS_POUND_DIVIDEND;
+import static org.eclipse.uomo.units.internal.NonSI.AVOIRDUPOIS_POUND_DIVISOR;
+
+import org.eclipse.uomo.units.AbstractSystemOfUnits;
+import org.unitsofmeasurement.quantity.Area;
+import org.unitsofmeasurement.quantity.Length;
+import org.unitsofmeasurement.quantity.Mass;
+import org.unitsofmeasurement.quantity.Temperature;
+import org.unitsofmeasurement.quantity.Time;
+import org.unitsofmeasurement.quantity.Volume;
+import org.unitsofmeasurement.unit.SystemOfUnits;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * <p>
+ * This class contains units from the Imperial system.
+ * </p>
+ * <p>
+ * 
+ * @noextend This class is not intended to be extended by clients.
+ * 
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.1 ($Revision: 332 $), $Date: 2011-09-11 14:52:11 +0200 $
+ * @see <a
+ *      href="http://en.wikipedia.org/wiki/http://en.wikipedia.org/wiki/Imperial_unit">Wikipedia:
+ *      Imperial Units</a>
+ */
+public final class Imperial extends AbstractSystemOfUnits  {
+
+	/**
+	 * Default constructor (prevents this class from being instantiated).
+	 */
+	private Imperial() {
+	}
+
+	/**
+	 * Returns the unique instance of this class.
+	 * 
+	 * @return the Imperial instance.
+	 */
+	public static SystemOfUnits getInstance() {
+		return INSTANCE;
+	}
+
+	private static final Imperial INSTANCE = new Imperial();
+
+	// //////////
+	// Length //
+	// //////////
+
+	/**
+	 * A unit of length equal to <code>0.0254 m</code> (standard name
+	 * <code>in</code>).
+	 */
+	public static final Unit<Length> INCH = USCustomary.INCH;
+	
+	// ////////
+	// Mass //
+	// ////////
+
+	/**
+	 * A unit of mass equal to <code>453.59237 grams</code> (avoirdupois pound,
+	 * standard name <code>lb</code>).
+	 */
+	static final Unit<Mass> POUND = addUnit(KILOGRAM.multiply(
+			AVOIRDUPOIS_POUND_DIVIDEND).divide(AVOIRDUPOIS_POUND_DIVISOR));
+
+	/**
+	 * A unit of mass equal to <code>1 / 16 {@link #POUND}</code> (standard name
+	 * <code>oz</code>).
+	 */
+	public static final Unit<Mass> OUNCE = addUnit(POUND.divide(16));
+	
+	/**
+	 * A unit of mass equal to <code>2240 {@link #POUND}</code> (long ton,
+	 * standard name <code>ton_uk</code>).
+	 */
+	public static final Unit<Mass> TON_UK = addUnit(POUND.multiply(2240));
+
+	/**
+	 * A unit of mass equal to <code>1000 kg</code> (metric ton, standard name
+	 * <code>t</code>).
+	 */
+	public static final Unit<Mass> METRIC_TON = addUnit(KILOGRAM.multiply(1000));
+
+	// ///////////////
+	// Temperature //
+	// ///////////////
+
+	/**
+	 * A unit of temperature equal to <code>5/9 °K</code> (standard name
+	 * <code>°R</code>).
+	 */
+	static final Unit<Temperature> RANKINE = addUnit(KELVIN.multiply(5)
+			.divide(9));
+
+	/**
+	 * A unit of temperature equal to degree Rankine minus
+	 * <code>459.67 °R</code> (standard name <code>°F</code>).
+	 * 
+	 * @see #RANKINE
+	 */
+	static final Unit<Temperature> FAHRENHEIT = addUnit(RANKINE
+			.add(459.67));
+
+	// /////////
+	// Angle //
+	// /////////
+
+	
+	// ////////////
+	// TimeUnit //
+	// ////////////
+	/**
+	 * A unit of time equal to <code>60 s</code> (standard name <code>min</code>
+	 * ).
+	 */
+	static final Unit<Time> MINUTE = addUnit(SECOND.multiply(60));
+
+	/**
+	 * A unit of duration equal to <code>60 {@link #MINUTE}</code> (standard
+	 * name <code>h</code>).
+	 */
+	static final Unit<Time> HOUR = addUnit(MINUTE.multiply(60));
+
+	// ////////////
+	// Velocity //
+	// ////////////
+
+
+	// ////////
+	// Area //
+	// ////////
+
+	/**
+	 * A unit of area (standard name <code>sft</code>
+	 * ).
+	 */
+	public static final Unit<Area> SQUARE_FOOT = USCustomary.SQUARE_FOOT;
+	
+	/**
+	 * One acre is 43,560 <code>square feet</code> (standard name <code>a</code>
+	 * ).
+	 */
+	public static final Unit<Area> ACRE = addUnit(SQUARE_FOOT.multiply(43560));
+
+	// ///////////////
+	// Data Amount //
+	// ///////////////
+	
+
+	// //////////
+	// Energy //
+	// //////////
+
+
+	// //////////
+	// Volume //
+	// //////////
+	/**
+	 * A unit of volume equal to one cubic decimeter (default label
+	 * <code>L</code>, also recognized <code>ÂµL, mL, cL, dL</code>).
+	 */
+	static final Unit<Volume> LITRE = addUnit(CUBIC_METRE.divide(1000));
+
+	/**
+	 * A unit of volume equal to one cubic inch (<code>in³</code>).
+	 */
+	static final Unit<Volume> CUBIC_INCH = addUnit(INCH.pow(3).asType(
+			Volume.class));
+
+	/**
+	 * A unit of volume equal to <code>4.546 09 {@link #LITRE}</code> (standard
+	 * name <code>gal_uk</code>).
+	 */
+	public static final Unit<Volume> GALLON_UK = addUnit(LITRE.multiply(454609)
+			.divide(100000));
+
+	/**
+	 * A unit of volume equal to one UK gallon, Liquid Unit.
+	 */
+	public static final Unit<Volume> GALLON_LIQUID = addUnit(CUBIC_INCH
+			.multiply(277.42));
+	
+	/**
+	 * A unit of volume equal to <code>1 / 160 {@link #GALLON_UK}</code>
+	 * (standard name <code>oz_fl_uk</code>).
+	 */
+	static final Unit<Volume> OUNCE_LIQUID_UK = addUnit(GALLON_UK
+			.divide(160));
+	
+	/**
+	 * A unit of volume equal to <code>1 / 160 {@link #GALLON_LIQUID}</code>
+	 * (standard name <code>oz_fl</code>).
+	 */
+	public static final Unit<Volume> OUNCE_LIQUID = OUNCE_LIQUID_UK;
+
+	/**
+	 * A unit of volume equal to <code>5 {@link #OUNCE_LIQUID}</code> (standard name
+	 * <code>gi</code>).
+	 */
+	public static final Unit<Volume> GILL = addUnit(OUNCE_LIQUID.multiply(5));
+
+	/**
+	 * A unit of volume equal to <code>20 {@link #OUNCE_LIQUID}</code> (standard name
+	 * <code>pt</code>).
+	 */
+	public static final Unit<Volume> PINT = addUnit(OUNCE_LIQUID.multiply(20));
+
+	/**
+	 * A unit of volume equal to <code>40 {@link #OUNCE_LIQUID}</code> (standard name
+	 * <code>qt</code>).
+	 */
+	public static final Unit<Volume> QUART = addUnit(OUNCE_LIQUID.multiply(40));
+	
+	/**
+	 * A unit of volume <code>~ 1 drop or 0.95 grain of water </code> (standard
+	 * name <code>min</code>).
+	 */
+	public static final Unit<Volume> MINIM = addUnit(MICRO(LITRE).multiply(
+			59.1938802d));
+
+	/**
+	 * A unit of volume equal to <code>20 {@link #MINIM}</code> (standard name
+	 * <code>fl scr</code>).
+	 */
+	public static final Unit<Volume> FLUID_SCRUPLE = addUnit(MINIM.multiply(60));
+
+	/**
+	 * A unit of volume equal to <code>3 {@link #FLUID_SCRUPLE}</code> (standard name
+	 * <code>fl drc</code>).
+	 */
+	public static final Unit<Volume> FLUID_DRACHM = addUnit(FLUID_SCRUPLE.multiply(3));
+
+
+	public String getName() {
+		return getClass().getSimpleName();
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/system/USCustomary.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/system/USCustomary.java
index a5eba34..8746a22 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/system/USCustomary.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/impl/system/USCustomary.java
@@ -1,393 +1,393 @@
-/**
- * Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Ikayzo and others - initial API and implementation
- */
-package org.eclipse.uomo.units.impl.system;
-
-import static org.eclipse.uomo.units.SI.*;
-import static org.eclipse.uomo.units.SI.Prefix.MICRO;
-
-import org.eclipse.uomo.units.AbstractSystemOfUnits;
-import org.eclipse.uomo.units.AbstractUnit;
-import org.eclipse.uomo.units.Messages;
-import org.eclipse.uomo.units.SI;
-import org.eclipse.uomo.units.impl.ProductUnit;
-import org.unitsofmeasurement.quantity.Angle;
-import org.unitsofmeasurement.quantity.Area;
-import org.unitsofmeasurement.quantity.Information;
-import org.unitsofmeasurement.quantity.Energy;
-import org.unitsofmeasurement.quantity.Length;
-import org.unitsofmeasurement.quantity.Mass;
-import org.unitsofmeasurement.quantity.Power;
-import org.unitsofmeasurement.quantity.Temperature;
-import org.unitsofmeasurement.quantity.Time;
-import org.unitsofmeasurement.quantity.Velocity;
-import org.unitsofmeasurement.quantity.Volume;
-import org.unitsofmeasurement.unit.SystemOfUnits;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * <p>
- * This class contains units from the United States customary system.
- * </p>
- * <p>
- * 
- * @noextend This class is not intended to be extended by clients.
- * 
- * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.15 ($Revision: 332 $), $Date: 2011-09-11 14:52:11 +0200 $
- * @see <a
- *      href="http://en.wikipedia.org/wiki/United_States_customary_units">Wikipedia:
- *      United State Customary Units</a>
- */
-public final class USCustomary extends AbstractSystemOfUnits {
-
-	/**
-	 * Default constructor (prevents this class from being instantiated).
-	 */
-	private USCustomary() {
-	}
-
-	/**
-	 * Returns the unique instance of this class.
-	 * 
-	 * @return the USCustomary instance.
-	 */
-	public static SystemOfUnits getInstance() {
-		return INSTANCE;
-	}
-
-	private static final USCustomary INSTANCE = new USCustomary();
-
-	// //////////
-	// Length //
-	// //////////
-	/**
-	 * US name for {@link SI#METRE}.
-	 */
-	public static final Unit<Length> METER = METRE;
-
-	/**
-	 * A unit of length equal to <code>0.3048 m</code> (standard name
-	 * <code>ft</code>).
-	 */
-	public static final Unit<Length> FOOT = addUnit(METER.multiply(3048)
-			.divide(10000));
-
-	/**
-	 * A unit of length equal to <code>1200/3937 m</code> (standard name
-	 * <code>foot_survey_us</code>). See also: <a
-	 * href="http://www.sizes.com/units/foot.htm">foot</a>
-	 */
-	public static final Unit<Length> FOOT_SURVEY = addUnit(METER.multiply(1200)
-			.divide(3937));
-
-	/**
-	 * A unit of length equal to <code>0.9144 m</code> (standard name
-	 * <code>yd</code>).
-	 */
-	public static final Unit<Length> YARD = addUnit(FOOT.multiply(3));
-
-	/**
-	 * A unit of length equal to <code>0.0254 m</code> (standard name
-	 * <code>in</code>).
-	 */
-	public static final Unit<Length> INCH = addUnit(FOOT.divide(12));
-
-	/**
-	 * A unit of length equal to <code>1609.344 m</code> (standard name
-	 * <code>mi</code>).
-	 */
-	public static final Unit<Length> MILE = addUnit(METER.multiply(1609344)
-			.divide(1000));
-
-	/**
-	 * A unit of length equal to the distance that light travels in one year
-	 * through a vacuum (standard name <code>ly</code>).
-	 */
-	public static final Unit<Length> LIGHT_YEAR = addUnit(METRE
-			.multiply(9.460528405e15));
-	
-	/**
-	 * A unit of length equal to <code>1852.0 m</code> (standard name
-	 * <code>nmi</code>).
-	 */
-	public static final Unit<Length> NAUTICAL_MILE = addUnit(METER
-			.multiply(1852));
-
-	// ////////
-	// Mass //
-	// ////////
-
-	/**
-	 * A unit of mass equal to <code>453.59237 grams</code> (avoirdupois pound,
-	 * standard name <code>lb</code>).
-	 */
-	public static final Unit<Mass> POUND = addUnit(KILOGRAM.multiply(45359237)
-			.divide(100000000), Messages.US_lb_name);
-
-	/**
-	 * A unit of mass equal to <code>1 / 16 {@link #POUND}</code> (standard name
-	 * <code>oz</code>).
-	 */
-	public static final Unit<Mass> OUNCE = addUnit(POUND.divide(16));
-
-	/**
-	 * A unit of mass equal to <code>2000 {@link #POUND}</code> (short ton,
-	 * standard name <code>ton</code>).
-	 */
-	public static final Unit<Mass> TON = addUnit(POUND.multiply(2000));
-
-	// ///////////////
-	// Temperature //
-	// ///////////////
-
-	/**
-	 * A unit of temperature equal to <code>5/9 °K</code> (standard name
-	 * <code>°R</code>).
-	 */
-	public static final Unit<Temperature> RANKINE = addUnit(KELVIN.multiply(5)
-			.divide(9));
-
-	/**
-	 * A unit of temperature equal to degree Rankine minus
-	 * <code>459.67 °R</code> (standard name <code>°F</code>).
-	 * 
-	 * @see #RANKINE
-	 */
-	public static final Unit<Temperature> FAHRENHEIT = addUnit(RANKINE
-			.add(459.67));
-
-	// /////////
-	// Angle //
-	// /////////
-
-	/**
-	 * A unit of angle equal to a full circle or <code>2<i>&pi;</i>
-	 * {@link SI#RADIAN}</code> (standard name <code>rev</code>).
-	 */
-	public static final Unit<Angle> REVOLUTION = addUnit(RADIAN.multiply(2)
-			.multiply(Math.PI).asType(Angle.class));
-
-	/**
-	 * A unit of angle equal to <code>1/360 {@link #REVOLUTION}</code> (standard
-	 * name <code>deg</code>).
-	 */
-	public static final Unit<Angle> DEGREE_ANGLE = addUnit(REVOLUTION
-			.divide(360));
-
-	/**
-	 * A unit of angle equal to <code>1/60 {@link #DEGREE_ANGLE}</code>
-	 * (standard name <code>'</code>).
-	 */
-	public static final Unit<Angle> MINUTE_ANGLE = addUnit(DEGREE_ANGLE
-			.divide(60));
-
-	/**
-	 * A unit of angle equal to <code>1/60 {@link #MINUTE_ANGLE}</code>
-	 * (standard name <code>"</code>).
-	 */
-	public static final Unit<Angle> SECOND_ANGLE = addUnit(MINUTE_ANGLE
-			.divide(60));
-
-	/**
-	 * A unit of angle equal to <code>0.01 {@link SI#RADIAN}</code> (standard
-	 * name <code>centiradian</code>).
-	 */
-	public static final Unit<Angle> CENTIRADIAN = addUnit(RADIAN.divide(100));
-
-	/**
-	 * A unit of angle measure equal to <code>1/400 {@link #REVOLUTION}</code>
-	 * (standard name <code>grade</code> ).
-	 */
-	public static final Unit<Angle> GRADE = addUnit(REVOLUTION.divide(400));
-	
-	// ////////////
-	// TimeUnit //
-	// ////////////
-	/**
-	 * A unit of time equal to <code>60 s</code> (standard name <code>min</code>
-	 * ).
-	 */
-	public static final Unit<Time> MINUTE = addUnit(SECOND.multiply(60));
-
-	/**
-	 * A unit of duration equal to <code>60 {@link #MINUTE}</code> (standard
-	 * name <code>h</code>).
-	 */
-	public static final Unit<Time> HOUR = addUnit(MINUTE.multiply(60));
-
-	// ////////////
-	// Velocity //
-	// ////////////
-	/**
-	 * A unit of velocity expressing the number of {@link #FOOT feet} per
-	 * {@link SI#SECOND second}.
-	 */
-	public static final Unit<Velocity> FEET_PER_SECOND = addUnit(
-			FOOT.divide(SECOND)).asType(Velocity.class);
-
-	/**
-	 * A unit of velocity expressing the number of international {@link #MILE
-	 * miles} per {@link #HOUR hour} (abbreviation <code>mph</code>).
-	 */
-	public static final Unit<Velocity> MILES_PER_HOUR = addUnit(
-			MILE.divide(HOUR)).asType(Velocity.class);
-
-	/**
-	 * A unit of velocity expressing the number of {@link #NAUTICAL_MILE
-	 * nautical miles} per {@link #HOUR hour} (abbreviation <code>kn</code>).
-	 */
-	public static final Unit<Velocity> KNOT = addUnit(
-			NAUTICAL_MILE.divide(HOUR)).asType(Velocity.class);
-
-	// ////////
-	// Area //
-	// ////////
-
-	/**
-	 * A unit of area (standard name <code>sft</code>
-	 * ).
-	 */
-	public static final Unit<Area> SQUARE_FOOT = addUnit(new ProductUnit<Area>(
-			(AbstractUnit<?>) FOOT.multiply(FOOT)));
-
-	/**
-	 * A unit of area equal to <code>100 m²</code> (standard name <code>a</code>
-	 * ).
-	 */
-	public static final Unit<Area> ARE = addUnit(SQUARE_METRE.multiply(100));
-	
-	/**
-	 * A unit of area equal to <code>100 {@link #ARE}</code> (standard name
-	 * <code>ha</code>).
-	 */
-	static final Unit<Area> HECTARE = addUnit(ARE.multiply(100)); // Exact.
-	
-	// ///////////////
-	// Data Amount //
-	// ///////////////
-	/**
-	 * A unit of data amount equal to <code>8 {@link SI#BIT}</code> (BinarY
-	 * TErm, standard name <code>byte</code>).
-	 */
-	public static final Unit<Information> BYTE = addUnit(BIT.multiply(8));
-
-	/**
-	 * Equivalent {@link #BYTE}
-	 */
-	public static final Unit<Information> OCTET = BYTE;
-
-	// //////////
-	// Energy //
-	// //////////
-
-	/**
-	 * A unit of energy equal to one electron-volt (standard name
-	 * <code>eV</code>, also recognized <code>keV, MeV, GeV</code>).
-	 */
-	public static final Unit<Energy> ELECTRON_VOLT = addUnit(JOULE
-			.multiply(1.602176462e-19));
-	
-	// //////////
-	// Power   //
-	// //////////
-	
-	/**
-	 * Horsepower (HP) is the name of several units of measurement of power.
-	 * The most common definitions equal between 735.5 and 750 watts.
-	 * Horsepower was originally defined to compare the output of steam engines with the power of draft horses. 
-	 * The unit was widely adopted to measure the output of piston engines, turbines, electric motors, and other machinery. The definition of the unit varied between geographical regions. Most countries now use the SI unit watt for measurement of power. With the implementation of the EU Directive 80/181/EEC on January 1, 2010, the use of horsepower in the EU is only permitted as supplementary unit.
-	 */
-	public static final Unit<Power> HORSEPOWER = addUnit(WATT.multiply(735.499));
-
-	// //////////
-	// Volume //
-	// //////////
-	/**
-	 * A unit of volume equal to one cubic decimeter (default label
-	 * <code>L</code>, also recognized <code>µL, mL, cL, dL</code>).
-	 */
-	public static final Unit<Volume> LITER = addUnit(CUBIC_METRE.divide(1000));
-
-	/**
-	 * A unit of volume equal to one cubic inch (<code>in³</code>).
-	 */
-	public static final Unit<Volume> CUBIC_INCH = addUnit(INCH.pow(3).asType(
-			Volume.class));
-
-	/**
-	 * A unit of volume equal to one US dry gallon. (standard name
-	 * <code>gallon_dry_us</code>).
-	 */
-	public static final Unit<Volume> GALLON_DRY = addUnit(CUBIC_INCH.multiply(
-			2688025).divide(10000));
-
-	/**
-	 * A unit of volume equal to one US gallon, Liquid Unit. The U.S. liquid
-	 * gallon is based on the Queen Anne or Wine gallon occupying 231 cubic
-	 * inches (standard name <code>gal</code>).
-	 */
-	public static final Unit<Volume> GALLON_LIQUID = addUnit(CUBIC_INCH
-			.multiply(231));
-
-	/**
-	 * A unit of volume equal to <code>1 / 128 {@link #GALLON_LIQUID}</code>
-	 * (standard name <code>oz_fl</code>).
-	 */
-	public static final Unit<Volume> OUNCE_LIQUID = addUnit(GALLON_LIQUID
-			.divide(128));
-
-	/**
-	 * A unit of volume <code>~ 1 drop or 0.95 grain of water </code> (standard
-	 * name <code>min</code>).
-	 */
-	public static final Unit<Volume> MINIM = addUnit(MICRO(LITER).multiply(
-			61.61152d));
-
-	/**
-	 * A unit of volume equal to <code>60 {@link #MINIM}</code> (standard name
-	 * <code>fl dr</code>).
-	 */
-	public static final Unit<Volume> FLUID_DRAM = addUnit(MINIM.multiply(60));
-
-	/**
-	 * A unit of volume equal to <code>80 {@link #MINIM}</code> (standard name
-	 * <code>tsp</code>).
-	 */
-	public static final Unit<Volume> TEASPOON = addUnit(MINIM.multiply(80));
-
-	/**
-	 * A unit of volume equal to <code>3 {@link #TEASPOON}</code> (standard name
-	 * <code>Tbsp</code>).
-	 */
-	public static final Unit<Volume> TABLESPOON = addUnit(TEASPOON.multiply(3));
-
-	/**
-	 * A unit of volume equal to <code>238.4810 {@link #LITER}</code> (standard
-	 * name <code>bbl</code>).
-	 */
-	public static final Unit<Volume> OIL_BARREL = addUnit(LITER
-			.multiply(238.4810d));
-
-	/**
-	 * Holds the international foot: 0.3048 m exact.
-	 */
-	// private static final int INTERNATIONAL_FOOT_DIVIDEND = 3048;
-
-	// private static final int INTERNATIONAL_FOOT_DIViSOR = 10000;
-
-
-
-	@Override
-	public String getName() {
-		return getClass().getSimpleName();
-	}
-}
+/**
+ * Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Ikayzo and others - initial API and implementation
+ */
+package org.eclipse.uomo.units.impl.system;
+
+import static org.eclipse.uomo.units.SI.*;
+import static org.eclipse.uomo.units.SI.Prefix.MICRO;
+
+import org.eclipse.uomo.units.AbstractSystemOfUnits;
+import org.eclipse.uomo.units.AbstractUnit;
+import org.eclipse.uomo.units.Messages;
+import org.eclipse.uomo.units.SI;
+import org.eclipse.uomo.units.impl.ProductUnit;
+import org.unitsofmeasurement.quantity.Angle;
+import org.unitsofmeasurement.quantity.Area;
+import org.unitsofmeasurement.quantity.Information;
+import org.unitsofmeasurement.quantity.Energy;
+import org.unitsofmeasurement.quantity.Length;
+import org.unitsofmeasurement.quantity.Mass;
+import org.unitsofmeasurement.quantity.Power;
+import org.unitsofmeasurement.quantity.Temperature;
+import org.unitsofmeasurement.quantity.Time;
+import org.unitsofmeasurement.quantity.Velocity;
+import org.unitsofmeasurement.quantity.Volume;
+import org.unitsofmeasurement.unit.SystemOfUnits;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * <p>
+ * This class contains units from the United States customary system.
+ * </p>
+ * <p>
+ * 
+ * @noextend This class is not intended to be extended by clients.
+ * 
+ * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.15 ($Revision: 332 $), $Date: 2011-09-11 14:52:11 +0200 $
+ * @see <a
+ *      href="http://en.wikipedia.org/wiki/United_States_customary_units">Wikipedia:
+ *      United State Customary Units</a>
+ */
+public final class USCustomary extends AbstractSystemOfUnits {
+
+	/**
+	 * Default constructor (prevents this class from being instantiated).
+	 */
+	private USCustomary() {
+	}
+
+	/**
+	 * Returns the unique instance of this class.
+	 * 
+	 * @return the USCustomary instance.
+	 */
+	public static SystemOfUnits getInstance() {
+		return INSTANCE;
+	}
+
+	private static final USCustomary INSTANCE = new USCustomary();
+
+	// //////////
+	// Length //
+	// //////////
+	/**
+	 * US name for {@link SI#METRE}.
+	 */
+	public static final Unit<Length> METER = METRE;
+
+	/**
+	 * A unit of length equal to <code>0.3048 m</code> (standard name
+	 * <code>ft</code>).
+	 */
+	public static final Unit<Length> FOOT = addUnit(METER.multiply(3048)
+			.divide(10000));
+
+	/**
+	 * A unit of length equal to <code>1200/3937 m</code> (standard name
+	 * <code>foot_survey_us</code>). See also: <a
+	 * href="http://www.sizes.com/units/foot.htm">foot</a>
+	 */
+	public static final Unit<Length> FOOT_SURVEY = addUnit(METER.multiply(1200)
+			.divide(3937));
+
+	/**
+	 * A unit of length equal to <code>0.9144 m</code> (standard name
+	 * <code>yd</code>).
+	 */
+	public static final Unit<Length> YARD = addUnit(FOOT.multiply(3));
+
+	/**
+	 * A unit of length equal to <code>0.0254 m</code> (standard name
+	 * <code>in</code>).
+	 */
+	public static final Unit<Length> INCH = addUnit(FOOT.divide(12));
+
+	/**
+	 * A unit of length equal to <code>1609.344 m</code> (standard name
+	 * <code>mi</code>).
+	 */
+	public static final Unit<Length> MILE = addUnit(METER.multiply(1609344)
+			.divide(1000));
+
+	/**
+	 * A unit of length equal to the distance that light travels in one year
+	 * through a vacuum (standard name <code>ly</code>).
+	 */
+	public static final Unit<Length> LIGHT_YEAR = addUnit(METRE
+			.multiply(9.460528405e15));
+	
+	/**
+	 * A unit of length equal to <code>1852.0 m</code> (standard name
+	 * <code>nmi</code>).
+	 */
+	public static final Unit<Length> NAUTICAL_MILE = addUnit(METER
+			.multiply(1852));
+
+	// ////////
+	// Mass //
+	// ////////
+
+	/**
+	 * A unit of mass equal to <code>453.59237 grams</code> (avoirdupois pound,
+	 * standard name <code>lb</code>).
+	 */
+	public static final Unit<Mass> POUND = addUnit(KILOGRAM.multiply(45359237)
+			.divide(100000000), Messages.US_lb_name);
+
+	/**
+	 * A unit of mass equal to <code>1 / 16 {@link #POUND}</code> (standard name
+	 * <code>oz</code>).
+	 */
+	public static final Unit<Mass> OUNCE = addUnit(POUND.divide(16));
+
+	/**
+	 * A unit of mass equal to <code>2000 {@link #POUND}</code> (short ton,
+	 * standard name <code>ton</code>).
+	 */
+	public static final Unit<Mass> TON = addUnit(POUND.multiply(2000));
+
+	// ///////////////
+	// Temperature //
+	// ///////////////
+
+	/**
+	 * A unit of temperature equal to <code>5/9 °K</code> (standard name
+	 * <code>°R</code>).
+	 */
+	public static final Unit<Temperature> RANKINE = addUnit(KELVIN.multiply(5)
+			.divide(9));
+
+	/**
+	 * A unit of temperature equal to degree Rankine minus
+	 * <code>459.67 °R</code> (standard name <code>°F</code>).
+	 * 
+	 * @see #RANKINE
+	 */
+	public static final Unit<Temperature> FAHRENHEIT = addUnit(RANKINE
+			.add(459.67));
+
+	// /////////
+	// Angle //
+	// /////////
+
+	/**
+	 * A unit of angle equal to a full circle or <code>2<i>&pi;</i>
+	 * {@link SI#RADIAN}</code> (standard name <code>rev</code>).
+	 */
+	public static final Unit<Angle> REVOLUTION = addUnit(RADIAN.multiply(2)
+			.multiply(Math.PI).asType(Angle.class));
+
+	/**
+	 * A unit of angle equal to <code>1/360 {@link #REVOLUTION}</code> (standard
+	 * name <code>deg</code>).
+	 */
+	public static final Unit<Angle> DEGREE_ANGLE = addUnit(REVOLUTION
+			.divide(360));
+
+	/**
+	 * A unit of angle equal to <code>1/60 {@link #DEGREE_ANGLE}</code>
+	 * (standard name <code>'</code>).
+	 */
+	public static final Unit<Angle> MINUTE_ANGLE = addUnit(DEGREE_ANGLE
+			.divide(60));
+
+	/**
+	 * A unit of angle equal to <code>1/60 {@link #MINUTE_ANGLE}</code>
+	 * (standard name <code>"</code>).
+	 */
+	public static final Unit<Angle> SECOND_ANGLE = addUnit(MINUTE_ANGLE
+			.divide(60));
+
+	/**
+	 * A unit of angle equal to <code>0.01 {@link SI#RADIAN}</code> (standard
+	 * name <code>centiradian</code>).
+	 */
+	public static final Unit<Angle> CENTIRADIAN = addUnit(RADIAN.divide(100));
+
+	/**
+	 * A unit of angle measure equal to <code>1/400 {@link #REVOLUTION}</code>
+	 * (standard name <code>grade</code> ).
+	 */
+	public static final Unit<Angle> GRADE = addUnit(REVOLUTION.divide(400));
+	
+	// ////////////
+	// TimeUnit //
+	// ////////////
+	/**
+	 * A unit of time equal to <code>60 s</code> (standard name <code>min</code>
+	 * ).
+	 */
+	public static final Unit<Time> MINUTE = addUnit(SECOND.multiply(60));
+
+	/**
+	 * A unit of duration equal to <code>60 {@link #MINUTE}</code> (standard
+	 * name <code>h</code>).
+	 */
+	public static final Unit<Time> HOUR = addUnit(MINUTE.multiply(60));
+
+	// ////////////
+	// Velocity //
+	// ////////////
+	/**
+	 * A unit of velocity expressing the number of {@link #FOOT feet} per
+	 * {@link SI#SECOND second}.
+	 */
+	public static final Unit<Velocity> FEET_PER_SECOND = addUnit(
+			FOOT.divide(SECOND)).asType(Velocity.class);
+
+	/**
+	 * A unit of velocity expressing the number of international {@link #MILE
+	 * miles} per {@link #HOUR hour} (abbreviation <code>mph</code>).
+	 */
+	public static final Unit<Velocity> MILES_PER_HOUR = addUnit(
+			MILE.divide(HOUR)).asType(Velocity.class);
+
+	/**
+	 * A unit of velocity expressing the number of {@link #NAUTICAL_MILE
+	 * nautical miles} per {@link #HOUR hour} (abbreviation <code>kn</code>).
+	 */
+	public static final Unit<Velocity> KNOT = addUnit(
+			NAUTICAL_MILE.divide(HOUR)).asType(Velocity.class);
+
+	// ////////
+	// Area //
+	// ////////
+
+	/**
+	 * A unit of area (standard name <code>sft</code>
+	 * ).
+	 */
+	public static final Unit<Area> SQUARE_FOOT = addUnit(new ProductUnit<Area>(
+			(AbstractUnit<?>) FOOT.multiply(FOOT)));
+
+	/**
+	 * A unit of area equal to <code>100 m²</code> (standard name <code>a</code>
+	 * ).
+	 */
+	public static final Unit<Area> ARE = addUnit(SQUARE_METRE.multiply(100));
+	
+	/**
+	 * A unit of area equal to <code>100 {@link #ARE}</code> (standard name
+	 * <code>ha</code>).
+	 */
+	static final Unit<Area> HECTARE = addUnit(ARE.multiply(100)); // Exact.
+	
+	// ///////////////
+	// Data Amount //
+	// ///////////////
+	/**
+	 * A unit of data amount equal to <code>8 {@link SI#BIT}</code> (BinarY
+	 * TErm, standard name <code>byte</code>).
+	 */
+	public static final Unit<Information> BYTE = addUnit(BIT.multiply(8));
+
+	/**
+	 * Equivalent {@link #BYTE}
+	 */
+	public static final Unit<Information> OCTET = BYTE;
+
+	// //////////
+	// Energy //
+	// //////////
+
+	/**
+	 * A unit of energy equal to one electron-volt (standard name
+	 * <code>eV</code>, also recognized <code>keV, MeV, GeV</code>).
+	 */
+	public static final Unit<Energy> ELECTRON_VOLT = addUnit(JOULE
+			.multiply(1.602176462e-19));
+	
+	// //////////
+	// Power   //
+	// //////////
+	
+	/**
+	 * Horsepower (HP) is the name of several units of measurement of power.
+	 * The most common definitions equal between 735.5 and 750 watts.
+	 * Horsepower was originally defined to compare the output of steam engines with the power of draft horses. 
+	 * The unit was widely adopted to measure the output of piston engines, turbines, electric motors, and other machinery. The definition of the unit varied between geographical regions. Most countries now use the SI unit watt for measurement of power. With the implementation of the EU Directive 80/181/EEC on January 1, 2010, the use of horsepower in the EU is only permitted as supplementary unit.
+	 */
+	public static final Unit<Power> HORSEPOWER = addUnit(WATT.multiply(735.499));
+
+	// //////////
+	// Volume //
+	// //////////
+	/**
+	 * A unit of volume equal to one cubic decimeter (default label
+	 * <code>L</code>, also recognized <code>µL, mL, cL, dL</code>).
+	 */
+	public static final Unit<Volume> LITER = addUnit(CUBIC_METRE.divide(1000));
+
+	/**
+	 * A unit of volume equal to one cubic inch (<code>in³</code>).
+	 */
+	public static final Unit<Volume> CUBIC_INCH = addUnit(INCH.pow(3).asType(
+			Volume.class));
+
+	/**
+	 * A unit of volume equal to one US dry gallon. (standard name
+	 * <code>gallon_dry_us</code>).
+	 */
+	public static final Unit<Volume> GALLON_DRY = addUnit(CUBIC_INCH.multiply(
+			2688025).divide(10000));
+
+	/**
+	 * A unit of volume equal to one US gallon, Liquid Unit. The U.S. liquid
+	 * gallon is based on the Queen Anne or Wine gallon occupying 231 cubic
+	 * inches (standard name <code>gal</code>).
+	 */
+	public static final Unit<Volume> GALLON_LIQUID = addUnit(CUBIC_INCH
+			.multiply(231));
+
+	/**
+	 * A unit of volume equal to <code>1 / 128 {@link #GALLON_LIQUID}</code>
+	 * (standard name <code>oz_fl</code>).
+	 */
+	public static final Unit<Volume> OUNCE_LIQUID = addUnit(GALLON_LIQUID
+			.divide(128));
+
+	/**
+	 * A unit of volume <code>~ 1 drop or 0.95 grain of water </code> (standard
+	 * name <code>min</code>).
+	 */
+	public static final Unit<Volume> MINIM = addUnit(MICRO(LITER).multiply(
+			61.61152d));
+
+	/**
+	 * A unit of volume equal to <code>60 {@link #MINIM}</code> (standard name
+	 * <code>fl dr</code>).
+	 */
+	public static final Unit<Volume> FLUID_DRAM = addUnit(MINIM.multiply(60));
+
+	/**
+	 * A unit of volume equal to <code>80 {@link #MINIM}</code> (standard name
+	 * <code>tsp</code>).
+	 */
+	public static final Unit<Volume> TEASPOON = addUnit(MINIM.multiply(80));
+
+	/**
+	 * A unit of volume equal to <code>3 {@link #TEASPOON}</code> (standard name
+	 * <code>Tbsp</code>).
+	 */
+	public static final Unit<Volume> TABLESPOON = addUnit(TEASPOON.multiply(3));
+
+	/**
+	 * A unit of volume equal to <code>238.4810 {@link #LITER}</code> (standard
+	 * name <code>bbl</code>).
+	 */
+	public static final Unit<Volume> OIL_BARREL = addUnit(LITER
+			.multiply(238.4810d));
+
+	/**
+	 * Holds the international foot: 0.3048 m exact.
+	 */
+	// private static final int INTERNATIONAL_FOOT_DIVIDEND = 3048;
+
+	// private static final int INTERNATIONAL_FOOT_DIViSOR = 10000;
+
+
+
+	@Override
+	public String getName() {
+		return getClass().getSimpleName();
+	}
+}
diff --git a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/package-info.java b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/package-info.java
index 2929189..d33ab3b 100644
--- a/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/package-info.java
+++ b/bundles/org.eclipse.uomo.units/src/main/java/org/eclipse/uomo/units/package-info.java
@@ -1,89 +1,89 @@
-/**
- * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil, Ikayzo and others - initial API and implementation
- */
-/**
- * Provides support for programatic unit handling.
- *
- * <h3> Standard/NonStandard Units</h3>
- *      Standard units and prefixes are provided by the
- *      {@link org.eclipse.uomo.units.SI} class (Système International d'Unités) and
- *      about 50 non-standard units are available through the
- *      {@link org.eclipse.uomo.units.impl.system.USCustomary} class.
- *
- * <h3>Usage examples:</h3>
- * [code]
- *
- * import static org.eclipse.uomo.units.SI.*;
- * import static org.eclipse.uomo.units.impl.system.USCustomary.*;
-
- * public class Main {
- *     public void main(String[] args) {
- *
- *         // Conversion between units (explicit way).
- *         Unit<Length> sourceUnit = KILO(METRE);
- *         Unit<Length> targetUnit = MILE;
- *         UnitConverter uc = sourceUnit.getConverterTo(targetUnit);
- *         System.out.println(uc.convert(10)); // Converts 10 km to miles.
- *
- *         // Same conversion than above, packed in one line.
- *         System.out.println(KILO(METRE).getConverterTo(MILE).convert(10));
- *
- *         // Retrieval of the system unit (identifies the measurement type).
- *         System.out.println(REVOLUTION.divide(MINUTE).toMetric());
- *
- *         // Dimension checking (allows/disallows conversions)
- *         System.out.println(ELECTRON_VOLT.isCompatible(WATT.times(HOUR)));
- *
- *         // Retrieval of the unit dimension (depends upon the current model).
- *         System.out.println(ELECTRON_VOLT.getDimension());
- *     }
- * }
- *
- * > 6.2137119223733395
- * > 6.2137119223733395
- * > rad/s
- * > true
- * > [L]²·[M]/[T]²
- * [/code]
- *
- * <h3>Unit Parameterization</h3>
- *
- *     Units are parameterized (e.g. &lt;Time extends {@link org.unitsofmeasure.Quantity Quantity}>) to
- *     enforce compile-time checks of units/measures consistency, for example:[code]
- *
- *     Unit<Time> MINUTE = SECOND.times(60); // Ok.
- *     Unit<Time> MINUTE = METRE.times(60); // Compile error.
- *
- *     Unit<Pressure> HECTOPASCAL = HECTO(PASCAL); // Ok.
- *     Unit<Pressure> HECTOPASCAL = HECTO(NEWTON); // Compile error.
- *
- *     TimeAmount duration = new TimeAmount(2, MINUTE); // Ok.
- *     TimeAmount duration = new TimeAmount(2, CELSIUS); // Compile error.
- *
- *     long milliseconds = duration.longValue(MILLI(SECOND)); // Ok.
- *     long milliseconds = duration.longValue(POUND); // Compile error.
- *     [/code]
- *
- *     Runtime checks of dimension consistency can be done for more complex cases.
- *
- *     [code]
- *     Unit<Area> SQUARE_FOOT = FOOT.times(FOOT).asType(Area.class); // Ok.
- *     Unit<Area> SQUARE_FOOT = FOOT.times(KELVIN).asType(Area.class); // Runtime error.
- *
- *     Unit<Temperature> KELVIN = Unit.valueOf("K").asType(Temperature.class); // Ok.
- *     Unit<Temperature> KELVIN = Unit.valueOf("kg").asType(Temperature.class); // Runtime error.
- *     [/code]
- *     </p>
- *
- * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 0.5.1, $Date: 2010-08-10 07:04:41 +0100 (Di, 10 Aug 2010) $
- */
-package org.eclipse.uomo.units;
+/**
+ * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil, Ikayzo and others - initial API and implementation
+ */
+/**
+ * Provides support for programatic unit handling.
+ *
+ * <h3> Standard/NonStandard Units</h3>
+ *      Standard units and prefixes are provided by the
+ *      {@link org.eclipse.uomo.units.SI} class (Système International d'Unités) and
+ *      about 50 non-standard units are available through the
+ *      {@link org.eclipse.uomo.units.impl.system.USCustomary} class.
+ *
+ * <h3>Usage examples:</h3>
+ * [code]
+ *
+ * import static org.eclipse.uomo.units.SI.*;
+ * import static org.eclipse.uomo.units.impl.system.USCustomary.*;
+
+ * public class Main {
+ *     public void main(String[] args) {
+ *
+ *         // Conversion between units (explicit way).
+ *         Unit<Length> sourceUnit = KILO(METRE);
+ *         Unit<Length> targetUnit = MILE;
+ *         UnitConverter uc = sourceUnit.getConverterTo(targetUnit);
+ *         System.out.println(uc.convert(10)); // Converts 10 km to miles.
+ *
+ *         // Same conversion than above, packed in one line.
+ *         System.out.println(KILO(METRE).getConverterTo(MILE).convert(10));
+ *
+ *         // Retrieval of the system unit (identifies the measurement type).
+ *         System.out.println(REVOLUTION.divide(MINUTE).toMetric());
+ *
+ *         // Dimension checking (allows/disallows conversions)
+ *         System.out.println(ELECTRON_VOLT.isCompatible(WATT.times(HOUR)));
+ *
+ *         // Retrieval of the unit dimension (depends upon the current model).
+ *         System.out.println(ELECTRON_VOLT.getDimension());
+ *     }
+ * }
+ *
+ * > 6.2137119223733395
+ * > 6.2137119223733395
+ * > rad/s
+ * > true
+ * > [L]²·[M]/[T]²
+ * [/code]
+ *
+ * <h3>Unit Parameterization</h3>
+ *
+ *     Units are parameterized (e.g. &lt;Time extends {@link org.unitsofmeasure.Quantity Quantity}>) to
+ *     enforce compile-time checks of units/measures consistency, for example:[code]
+ *
+ *     Unit<Time> MINUTE = SECOND.times(60); // Ok.
+ *     Unit<Time> MINUTE = METRE.times(60); // Compile error.
+ *
+ *     Unit<Pressure> HECTOPASCAL = HECTO(PASCAL); // Ok.
+ *     Unit<Pressure> HECTOPASCAL = HECTO(NEWTON); // Compile error.
+ *
+ *     TimeAmount duration = new TimeAmount(2, MINUTE); // Ok.
+ *     TimeAmount duration = new TimeAmount(2, CELSIUS); // Compile error.
+ *
+ *     long milliseconds = duration.longValue(MILLI(SECOND)); // Ok.
+ *     long milliseconds = duration.longValue(POUND); // Compile error.
+ *     [/code]
+ *
+ *     Runtime checks of dimension consistency can be done for more complex cases.
+ *
+ *     [code]
+ *     Unit<Area> SQUARE_FOOT = FOOT.times(FOOT).asType(Area.class); // Ok.
+ *     Unit<Area> SQUARE_FOOT = FOOT.times(KELVIN).asType(Area.class); // Runtime error.
+ *
+ *     Unit<Temperature> KELVIN = Unit.valueOf("K").asType(Temperature.class); // Ok.
+ *     Unit<Temperature> KELVIN = Unit.valueOf("kg").asType(Temperature.class); // Runtime error.
+ *     [/code]
+ *     </p>
+ *
+ * @author  <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 0.5.1, $Date: 2010-08-10 07:04:41 +0100 (Di, 10 Aug 2010) $
+ */
+package org.eclipse.uomo.units;
diff --git a/bundles/org.eclipse.uomo.units/src/main/resources/org/eclipse/uomo/units/impl/format/messages.properties b/bundles/org.eclipse.uomo.units/src/main/resources/org/eclipse/uomo/units/impl/format/messages.properties
index 6e96c98..18e7765 100644
--- a/bundles/org.eclipse.uomo.units/src/main/resources/org/eclipse/uomo/units/impl/format/messages.properties
+++ b/bundles/org.eclipse.uomo.units/src/main/resources/org/eclipse/uomo/units/impl/format/messages.properties
@@ -1,90 +1,90 @@
-#Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net)
-#
-# Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Werner Keil, Ikayzo and others - initial API and implementation
-#
-
-# Imperial Units
-org.eclipse.uomo.units.impl.system.Imperial.GALLON_UK            = gal_uk
-# SI Units
-org.eclipse.uomo.units.SI.AMPERE                     = A
-org.eclipse.uomo.units.SI.AMPERE_TURN                = At
-org.eclipse.uomo.units.SI.BECQUEREL                  = Bq
-org.eclipse.uomo.units.SI.CANDELA                    = cd
-org.eclipse.uomo.units.SI.CELSIUS                    = \u00B0C
-org.eclipse.uomo.units.SI.CELSIUS.1                  = \u2103
-org.eclipse.uomo.units.SI.CELSIUS.2                  = Celsius
-org.eclipse.uomo.units.SI.COULOMB                    = C
-org.eclipse.uomo.units.SI.FARAD                      = F
-org.eclipse.uomo.units.SI.GRAM                       = g
-org.eclipse.uomo.units.SI.GRAY                       = Gy
-org.eclipse.uomo.units.SI.HENRY                      = H
-org.eclipse.uomo.units.SI.HERTZ                      = Hz
-org.eclipse.uomo.units.SI.HERTZ.2                    = hertz
-org.eclipse.uomo.units.SI.JOULE                      = J
-org.eclipse.uomo.units.SI.KATAL                      = kat
-org.eclipse.uomo.units.SI.KELVIN                     = K
-org.eclipse.uomo.units.SI.KILOGRAM                   = kg
-org.eclipse.uomo.units.SI.KILOGRAM.1                 = kilogram
-org.eclipse.uomo.units.SI.LUMEN                      = lm
-org.eclipse.uomo.units.SI.LUX                        = lx
-org.eclipse.uomo.units.SI.METRE                      = m
-org.eclipse.uomo.units.SI.MOLE                       = mol
-org.eclipse.uomo.units.SI.NEWTON                     = N
-org.eclipse.uomo.units.SI.OHM                        = \u03A9
-org.eclipse.uomo.units.SI.PASCAL                     = Pa
-org.eclipse.uomo.units.SI.RADIAN                     = rad
-org.eclipse.uomo.units.SI.ROENTGEN                   = R
-org.eclipse.uomo.units.SI.SECOND                     = s
-org.eclipse.uomo.units.SI.SIEMENS                    = S
-org.eclipse.uomo.units.SI.SIEVERT                    = Sv
-org.eclipse.uomo.units.SI.STERADIAN                  = sr
-org.eclipse.uomo.units.SI.TESLA                      = T
-org.eclipse.uomo.units.SI.VOLT                       = V
-org.eclipse.uomo.units.SI.WATT                       = W
-org.eclipse.uomo.units.SI.WEBER                      = Wb
-
-# US Units
-org.eclipse.uomo.units.impl.system.USCustomary.FAHRENHEIT 		 = \u00B0F
-org.eclipse.uomo.units.impl.system.USCustomary.FAHRENHEIT.1      = \u2109
-org.eclipse.uomo.units.impl.system.USCustomary.FOOT              = ft
-org.eclipse.uomo.units.impl.system.USCustomary.HORSEPOWER        = hp
-org.eclipse.uomo.units.impl.system.USCustomary.GALLON_LIQUID 	 = gal
-org.eclipse.uomo.units.impl.system.USCustomary.GALLON_DRY 	     = gal_dry
-org.eclipse.uomo.units.impl.system.USCustomary.INCH              = in
-org.eclipse.uomo.units.impl.system.USCustomary.KNOT              = kn
-org.eclipse.uomo.units.impl.system.USCustomary.LITER             = l
-org.eclipse.uomo.units.impl.system.USCustomary.MILE    			 = mi
-org.eclipse.uomo.units.impl.system.USCustomary.MILES_PER_HOUR    = mph
-org.eclipse.uomo.units.impl.system.USCustomary.POUND			 = lb
-# SI Prefixes
-org.eclipse.uomo.units.impl.format.ParsePrefix.ATTO  = a
-org.eclipse.uomo.units.impl.format.ParsePrefix.CENTI = c
-org.eclipse.uomo.units.impl.format.ParsePrefix.DECI  = d
-org.eclipse.uomo.units.impl.format.ParsePrefix.DEKA  = da
-org.eclipse.uomo.units.impl.format.ParsePrefix.EXA   = E
-org.eclipse.uomo.units.impl.format.ParsePrefix.FEMTO = f
-org.eclipse.uomo.units.impl.format.ParsePrefix.GIGA  = G
-org.eclipse.uomo.units.impl.format.ParsePrefix.HECTO = h
-org.eclipse.uomo.units.impl.format.ParsePrefix.KILO  = k
-org.eclipse.uomo.units.impl.format.ParsePrefix.MEGA  = M
-org.eclipse.uomo.units.impl.format.ParsePrefix.MICRO = \u00B5
-org.eclipse.uomo.units.impl.format.ParsePrefix.MILLI = m
-org.eclipse.uomo.units.impl.format.ParsePrefix.NANO  = n
-org.eclipse.uomo.units.impl.format.ParsePrefix.PETA  = P
-org.eclipse.uomo.units.impl.format.ParsePrefix.PICO  = p
-org.eclipse.uomo.units.impl.format.ParsePrefix.TERA  = T
-org.eclipse.uomo.units.impl.format.ParsePrefix.YOCTO = y
-org.eclipse.uomo.units.impl.format.ParsePrefix.YOTTA = Y
-org.eclipse.uomo.units.impl.format.ParsePrefix.ZEPTO = z
-org.eclipse.uomo.units.impl.format.ParsePrefix.ZETTA = Z
-
-org.eclipse.uomo.units.impl.system.Imperial.PINT=pt
-
+#Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net)
+#
+# Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#    Werner Keil, Ikayzo and others - initial API and implementation
+#
+
+# Imperial Units
+org.eclipse.uomo.units.impl.system.Imperial.GALLON_UK            = gal_uk
+# SI Units
+org.eclipse.uomo.units.SI.AMPERE                     = A
+org.eclipse.uomo.units.SI.AMPERE_TURN                = At
+org.eclipse.uomo.units.SI.BECQUEREL                  = Bq
+org.eclipse.uomo.units.SI.CANDELA                    = cd
+org.eclipse.uomo.units.SI.CELSIUS                    = \u00B0C
+org.eclipse.uomo.units.SI.CELSIUS.1                  = \u2103
+org.eclipse.uomo.units.SI.CELSIUS.2                  = Celsius
+org.eclipse.uomo.units.SI.COULOMB                    = C
+org.eclipse.uomo.units.SI.FARAD                      = F
+org.eclipse.uomo.units.SI.GRAM                       = g
+org.eclipse.uomo.units.SI.GRAY                       = Gy
+org.eclipse.uomo.units.SI.HENRY                      = H
+org.eclipse.uomo.units.SI.HERTZ                      = Hz
+org.eclipse.uomo.units.SI.HERTZ.2                    = hertz
+org.eclipse.uomo.units.SI.JOULE                      = J
+org.eclipse.uomo.units.SI.KATAL                      = kat
+org.eclipse.uomo.units.SI.KELVIN                     = K
+org.eclipse.uomo.units.SI.KILOGRAM                   = kg
+org.eclipse.uomo.units.SI.KILOGRAM.1                 = kilogram
+org.eclipse.uomo.units.SI.LUMEN                      = lm
+org.eclipse.uomo.units.SI.LUX                        = lx
+org.eclipse.uomo.units.SI.METRE                      = m
+org.eclipse.uomo.units.SI.MOLE                       = mol
+org.eclipse.uomo.units.SI.NEWTON                     = N
+org.eclipse.uomo.units.SI.OHM                        = \u03A9
+org.eclipse.uomo.units.SI.PASCAL                     = Pa
+org.eclipse.uomo.units.SI.RADIAN                     = rad
+org.eclipse.uomo.units.SI.ROENTGEN                   = R
+org.eclipse.uomo.units.SI.SECOND                     = s
+org.eclipse.uomo.units.SI.SIEMENS                    = S
+org.eclipse.uomo.units.SI.SIEVERT                    = Sv
+org.eclipse.uomo.units.SI.STERADIAN                  = sr
+org.eclipse.uomo.units.SI.TESLA                      = T
+org.eclipse.uomo.units.SI.VOLT                       = V
+org.eclipse.uomo.units.SI.WATT                       = W
+org.eclipse.uomo.units.SI.WEBER                      = Wb
+
+# US Units
+org.eclipse.uomo.units.impl.system.USCustomary.FAHRENHEIT 		 = \u00B0F
+org.eclipse.uomo.units.impl.system.USCustomary.FAHRENHEIT.1      = \u2109
+org.eclipse.uomo.units.impl.system.USCustomary.FOOT              = ft
+org.eclipse.uomo.units.impl.system.USCustomary.HORSEPOWER        = hp
+org.eclipse.uomo.units.impl.system.USCustomary.GALLON_LIQUID 	 = gal
+org.eclipse.uomo.units.impl.system.USCustomary.GALLON_DRY 	     = gal_dry
+org.eclipse.uomo.units.impl.system.USCustomary.INCH              = in
+org.eclipse.uomo.units.impl.system.USCustomary.KNOT              = kn
+org.eclipse.uomo.units.impl.system.USCustomary.LITER             = l
+org.eclipse.uomo.units.impl.system.USCustomary.MILE    			 = mi
+org.eclipse.uomo.units.impl.system.USCustomary.MILES_PER_HOUR    = mph
+org.eclipse.uomo.units.impl.system.USCustomary.POUND			 = lb
+# SI Prefixes
+org.eclipse.uomo.units.impl.format.ParsePrefix.ATTO  = a
+org.eclipse.uomo.units.impl.format.ParsePrefix.CENTI = c
+org.eclipse.uomo.units.impl.format.ParsePrefix.DECI  = d
+org.eclipse.uomo.units.impl.format.ParsePrefix.DEKA  = da
+org.eclipse.uomo.units.impl.format.ParsePrefix.EXA   = E
+org.eclipse.uomo.units.impl.format.ParsePrefix.FEMTO = f
+org.eclipse.uomo.units.impl.format.ParsePrefix.GIGA  = G
+org.eclipse.uomo.units.impl.format.ParsePrefix.HECTO = h
+org.eclipse.uomo.units.impl.format.ParsePrefix.KILO  = k
+org.eclipse.uomo.units.impl.format.ParsePrefix.MEGA  = M
+org.eclipse.uomo.units.impl.format.ParsePrefix.MICRO = \u00B5
+org.eclipse.uomo.units.impl.format.ParsePrefix.MILLI = m
+org.eclipse.uomo.units.impl.format.ParsePrefix.NANO  = n
+org.eclipse.uomo.units.impl.format.ParsePrefix.PETA  = P
+org.eclipse.uomo.units.impl.format.ParsePrefix.PICO  = p
+org.eclipse.uomo.units.impl.format.ParsePrefix.TERA  = T
+org.eclipse.uomo.units.impl.format.ParsePrefix.YOCTO = y
+org.eclipse.uomo.units.impl.format.ParsePrefix.YOTTA = Y
+org.eclipse.uomo.units.impl.format.ParsePrefix.ZEPTO = z
+org.eclipse.uomo.units.impl.format.ParsePrefix.ZETTA = Z
+
+org.eclipse.uomo.units.impl.system.Imperial.PINT=pt
+
 org.eclipse.uomo.units.impl.system.CommonUnits.KILOMETRES_PER_HOUR=kph
\ No newline at end of file
diff --git a/bundles/org.eclipse.uomo.units/src/main/resources/org/eclipse/uomo/units/impl/format/messages_en_GB.properties b/bundles/org.eclipse.uomo.units/src/main/resources/org/eclipse/uomo/units/impl/format/messages_en_GB.properties
index 45c31eb..a9c2d0e 100644
--- a/bundles/org.eclipse.uomo.units/src/main/resources/org/eclipse/uomo/units/impl/format/messages_en_GB.properties
+++ b/bundles/org.eclipse.uomo.units/src/main/resources/org/eclipse/uomo/units/impl/format/messages_en_GB.properties
@@ -1,19 +1,19 @@
-#Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net)
-# Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Werner Keil, Ikayzo and others - initial API and implementation
-#
-
-org.eclipse.uomo.units.impl.system.Imperial.GALLON_UK        = gal
-org.eclipse.uomo.units.impl.system.Imperial.OUNCE_LIQUID     = fl oz
-org.eclipse.uomo.units.impl.system.Imperial.TON_UK           = ton
-org.eclipse.uomo.units.impl.system.USCustomary.FOOT_SURVEY   = ft_survey_us
-org.eclipse.uomo.units.impl.system.USCustomary.GALLON_DRY    = gallon_dry_us
-org.eclipse.uomo.units.impl.system.USCustomary.GALLON_LIQUID = gal_us
-org.eclipse.uomo.units.impl.system.USCustomary.OUNCE_LIQUID  = fl oz US
-org.eclipse.uomo.units.impl.system.USCustomary.TON           = ton_us
+#Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net)
+# Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#    Werner Keil, Ikayzo and others - initial API and implementation
+#
+
+org.eclipse.uomo.units.impl.system.Imperial.GALLON_UK        = gal
+org.eclipse.uomo.units.impl.system.Imperial.OUNCE_LIQUID     = fl oz
+org.eclipse.uomo.units.impl.system.Imperial.TON_UK           = ton
+org.eclipse.uomo.units.impl.system.USCustomary.FOOT_SURVEY   = ft_survey_us
+org.eclipse.uomo.units.impl.system.USCustomary.GALLON_DRY    = gallon_dry_us
+org.eclipse.uomo.units.impl.system.USCustomary.GALLON_LIQUID = gal_us
+org.eclipse.uomo.units.impl.system.USCustomary.OUNCE_LIQUID  = fl oz US
+org.eclipse.uomo.units.impl.system.USCustomary.TON           = ton_us
diff --git a/bundles/org.eclipse.uomo.units/src/main/resources/org/eclipse/uomo/units/impl/format/messages_en_US.properties b/bundles/org.eclipse.uomo.units/src/main/resources/org/eclipse/uomo/units/impl/format/messages_en_US.properties
index bf8349f..d1426d7 100644
--- a/bundles/org.eclipse.uomo.units/src/main/resources/org/eclipse/uomo/units/impl/format/messages_en_US.properties
+++ b/bundles/org.eclipse.uomo.units/src/main/resources/org/eclipse/uomo/units/impl/format/messages_en_US.properties
@@ -1,17 +1,17 @@
-#Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net)
-#
-# Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Werner Keil, Ikayzo and others - initial API and implementation
-#
-
-org.eclipse.uomo.units.impl.system.USCustomary.ELECTRON_VOLT = eV
-org.eclipse.uomo.units.impl.system.USCustomary.GALLON_DRY    = gallon_dry
-org.eclipse.uomo.units.impl.system.USCustomary.GALLON_LIQUID = gal
-org.eclipse.uomo.units.impl.system.USCustomary.OUNCE_LIQUID  = fl oz
-org.eclipse.uomo.units.impl.system.USCustomary.TON           = ton
+#Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net)
+#
+# Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#    Werner Keil, Ikayzo and others - initial API and implementation
+#
+
+org.eclipse.uomo.units.impl.system.USCustomary.ELECTRON_VOLT = eV
+org.eclipse.uomo.units.impl.system.USCustomary.GALLON_DRY    = gallon_dry
+org.eclipse.uomo.units.impl.system.USCustomary.GALLON_LIQUID = gal
+org.eclipse.uomo.units.impl.system.USCustomary.OUNCE_LIQUID  = fl oz
+org.eclipse.uomo.units.impl.system.USCustomary.TON           = ton
diff --git a/bundles/org.eclipse.uomo.units/src/main/resources/org/eclipse/uomo/units/impl/format/messages_fr.properties b/bundles/org.eclipse.uomo.units/src/main/resources/org/eclipse/uomo/units/impl/format/messages_fr.properties
index 4b79570..e25054a 100644
--- a/bundles/org.eclipse.uomo.units/src/main/resources/org/eclipse/uomo/units/impl/format/messages_fr.properties
+++ b/bundles/org.eclipse.uomo.units/src/main/resources/org/eclipse/uomo/units/impl/format/messages_fr.properties
@@ -1,37 +1,37 @@
-#Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net)
-#
-# Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Werner Keil, Ikayzo and others - initial API and implementation
-#
-# Contributors:
-#    Werner Keil, Ikayzo and others - initial API and implementation
-#
-#  See LICENSE.txt for full License
-#
-#  See LICENSE.txt for full License
-#
-#  See LICENSE.txt for full License
-#
-#  See LICENSE.txt for full License
-#
-#  See LICENSE.txt for full License
-#
-#  See LICENSE.txt for full License
-#
-#Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net)
-#
-#  Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil
-#  All rights reserved.
-#
-#  See LICENSE.txt for the Specification License
-#
-# NOTE: as a Java properties file, this file must use the
-# ISO 8859-1 encoding, so all non-ASCII Unicode characters 
-# must be escaped using the \uXXXX syntax.
-# See http://java.sun.com/j2se/1.5.0/docs/api/java/util/Properties.html#encoding
+#Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net)
+#
+# Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#    Werner Keil, Ikayzo and others - initial API and implementation
+#
+# Contributors:
+#    Werner Keil, Ikayzo and others - initial API and implementation
+#
+#  See LICENSE.txt for full License
+#
+#  See LICENSE.txt for full License
+#
+#  See LICENSE.txt for full License
+#
+#  See LICENSE.txt for full License
+#
+#  See LICENSE.txt for full License
+#
+#  See LICENSE.txt for full License
+#
+#Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net)
+#
+#  Copyright (c) 2005-2010, Jean-Marie Dautelle, Werner Keil
+#  All rights reserved.
+#
+#  See LICENSE.txt for the Specification License
+#
+# NOTE: as a Java properties file, this file must use the
+# ISO 8859-1 encoding, so all non-ASCII Unicode characters 
+# must be escaped using the \uXXXX syntax.
+# See http://java.sun.com/j2se/1.5.0/docs/api/java/util/Properties.html#encoding
diff --git a/bundles/org.eclipse.uomo.units/src/site/.gitignore b/bundles/org.eclipse.uomo.units/src/site/.gitignore
index 35815fc..e443902 100644
--- a/bundles/org.eclipse.uomo.units/src/site/.gitignore
+++ b/bundles/org.eclipse.uomo.units/src/site/.gitignore
@@ -1 +1 @@
-/.svn
+/.svn
diff --git a/bundles/org.eclipse.uomo.units/src/site/apt/.gitignore b/bundles/org.eclipse.uomo.units/src/site/apt/.gitignore
index 35815fc..e443902 100644
--- a/bundles/org.eclipse.uomo.units/src/site/apt/.gitignore
+++ b/bundles/org.eclipse.uomo.units/src/site/apt/.gitignore
@@ -1 +1 @@
-/.svn
+/.svn
diff --git a/bundles/org.eclipse.uomo.units/src/site/apt/implementations.apt b/bundles/org.eclipse.uomo.units/src/site/apt/implementations.apt
index 655f528..56c49ce 100644
--- a/bundles/org.eclipse.uomo.units/src/site/apt/implementations.apt
+++ b/bundles/org.eclipse.uomo.units/src/site/apt/implementations.apt
@@ -1,16 +1,16 @@
-Implementations
-
-  Some projects that are known to implement the <Unit of Measurement> API are:
-
-    * Open Source Projects
-    
-        * {{{http://www.eclipse.org/uomo/}UOMo}} at Eclipse
-
-        * {{{http://jscience.org/}JScience}}
-    
-    * Commercial / Closed Source
-    
-        * Web Applications at {{{http://www.globalservices.bt.com/}BT Global Services}}
-
-  If you would like to add your product to this list, please let us known on the
-  {{{mail-lists.html}mailing list}}.
+Implementations
+
+  Some projects that are known to implement the <Unit of Measurement> API are:
+
+    * Open Source Projects
+    
+        * {{{http://www.eclipse.org/uomo/}UOMo}} at Eclipse
+
+        * {{{http://jscience.org/}JScience}}
+    
+    * Commercial / Closed Source
+    
+        * Web Applications at {{{http://www.globalservices.bt.com/}BT Global Services}}
+
+  If you would like to add your product to this list, please let us known on the
+  {{{mail-lists.html}mailing list}}.
diff --git a/bundles/org.eclipse.uomo.units/src/site/resources/.gitignore b/bundles/org.eclipse.uomo.units/src/site/resources/.gitignore
index 35815fc..e443902 100644
--- a/bundles/org.eclipse.uomo.units/src/site/resources/.gitignore
+++ b/bundles/org.eclipse.uomo.units/src/site/resources/.gitignore
@@ -1 +1 @@
-/.svn
+/.svn
diff --git a/bundles/org.eclipse.uomo.units/src/site/resources/images/.gitignore b/bundles/org.eclipse.uomo.units/src/site/resources/images/.gitignore
index 35815fc..e443902 100644
--- a/bundles/org.eclipse.uomo.units/src/site/resources/images/.gitignore
+++ b/bundles/org.eclipse.uomo.units/src/site/resources/images/.gitignore
@@ -1 +1 @@
-/.svn
+/.svn
diff --git a/bundles/org.eclipse.uomo.util.tests/.classpath b/bundles/org.eclipse.uomo.util.tests/.classpath
index 0b1bcf9..9bc33d3 100644
--- a/bundles/org.eclipse.uomo.util.tests/.classpath
+++ b/bundles/org.eclipse.uomo.util.tests/.classpath
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src/"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/bundles/org.eclipse.uomo.util.tests/.gitignore b/bundles/org.eclipse.uomo.util.tests/.gitignore
index ea8c4bf..0b42d2d 100644
--- a/bundles/org.eclipse.uomo.util.tests/.gitignore
+++ b/bundles/org.eclipse.uomo.util.tests/.gitignore
@@ -1 +1 @@
-/target
+/target
diff --git a/bundles/org.eclipse.uomo.util.tests/.project b/bundles/org.eclipse.uomo.util.tests/.project
index 1d1e8fe..3d8fa9a 100644
--- a/bundles/org.eclipse.uomo.util.tests/.project
+++ b/bundles/org.eclipse.uomo.util.tests/.project
@@ -1,34 +1,34 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.uomo.util.tests</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.uomo.util.tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/bundles/org.eclipse.uomo.util.tests/.settings/.gitignore b/bundles/org.eclipse.uomo.util.tests/.settings/.gitignore
index 0924da4..c14d360 100644
--- a/bundles/org.eclipse.uomo.util.tests/.settings/.gitignore
+++ b/bundles/org.eclipse.uomo.util.tests/.settings/.gitignore
@@ -1 +1 @@
-/org.eclipse.m2e.core.prefs
+/org.eclipse.m2e.core.prefs
diff --git a/bundles/org.eclipse.uomo.util.tests/META-INF/MANIFEST.MF b/bundles/org.eclipse.uomo.util.tests/META-INF/MANIFEST.MF
index c2b26f7..fe5b27a 100644
--- a/bundles/org.eclipse.uomo.util.tests/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.uomo.util.tests/META-INF/MANIFEST.MF
@@ -1,11 +1,11 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: UoMO Units Tests
-Bundle-SymbolicName: org.eclipse.uomo.util.tests
-Bundle-Version: 0.7.0.qualifier
-Bundle-Vendor: Eclipse org
-Fragment-Host: org.eclipse.uomo.util;bundle-version="0.7.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Export-Package: org.eclipse.uomo.util.test,
- org.eclipse.uomo.util.test.numbers
-Require-Bundle: org.junit;bundle-version="4.8.2"
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: UoMO Units Tests
+Bundle-SymbolicName: org.eclipse.uomo.util.tests
+Bundle-Version: 0.7.0.qualifier
+Bundle-Vendor: Eclipse org
+Fragment-Host: org.eclipse.uomo.util;bundle-version="0.7.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Export-Package: org.eclipse.uomo.util.test,
+ org.eclipse.uomo.util.test.numbers
+Require-Bundle: org.junit;bundle-version="4.8.2"
diff --git a/bundles/org.eclipse.uomo.util.tests/build.properties b/bundles/org.eclipse.uomo.util.tests/build.properties
index ced5f40..c4e35e4 100644
--- a/bundles/org.eclipse.uomo.util.tests/build.properties
+++ b/bundles/org.eclipse.uomo.util.tests/build.properties
@@ -1,4 +1,4 @@
-source.. = src/
-output.. = target/classes
-bin.includes = META-INF/,\
-               .
+source.. = src/
+output.. = target/classes
+bin.includes = META-INF/,\
+               .
diff --git a/bundles/org.eclipse.uomo.util.tests/src/org/eclipse/uomo/util/test/Iso8601DateUtilityTests.java b/bundles/org.eclipse.uomo.util.tests/src/org/eclipse/uomo/util/test/Iso8601DateUtilityTests.java
index 7568053..1bb8f3e 100644
--- a/bundles/org.eclipse.uomo.util.tests/src/org/eclipse/uomo/util/test/Iso8601DateUtilityTests.java
+++ b/bundles/org.eclipse.uomo.util.tests/src/org/eclipse/uomo/util/test/Iso8601DateUtilityTests.java
@@ -1,38 +1,38 @@
-/*******************************************************************************
- * Crown Copyright (c) 2006, 2007, Copyright (c) 2006, 2007 Jiva Medical.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *    Jiva Medical - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.uomo.util.test;
-
-import junit.framework.TestCase;
-
-import org.eclipse.uomo.util.impl.Iso8601Date;
-import org.junit.Test;
-
-public class Iso8601DateUtilityTests extends TestCase {
-   
-	private Iso8601Date du;
-	
-	@Override
-	protected void setUp() throws Exception {
-		super.setUp();
-		du = new Iso8601Date();
-	}
-	
-	@Test
-	public void testFullDate() {
-		String st;
-		st = du.parse("20071017111114.789", Iso8601Date.ISO_DATE_VALIDATION_FULL, Iso8601Date.OPTIONAL);
-		assertTrue(st, st == null);
-		st = du.parse("20061027000000.0020", Iso8601Date.ISO_DATE_VALIDATION_FULL, Iso8601Date.OPTIONAL);
-		assertTrue(st, st == null);
-	}
-
-}
+/*******************************************************************************
+ * Crown Copyright (c) 2006, 2007, Copyright (c) 2006, 2007 Jiva Medical.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *    Jiva Medical - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.uomo.util.test;
+
+import junit.framework.TestCase;
+
+import org.eclipse.uomo.util.impl.Iso8601Date;
+import org.junit.Test;
+
+public class Iso8601DateUtilityTests extends TestCase {
+   
+	private Iso8601Date du;
+	
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		du = new Iso8601Date();
+	}
+	
+	@Test
+	public void testFullDate() {
+		String st;
+		st = du.parse("20071017111114.789", Iso8601Date.ISO_DATE_VALIDATION_FULL, Iso8601Date.OPTIONAL);
+		assertTrue(st, st == null);
+		st = du.parse("20061027000000.0020", Iso8601Date.ISO_DATE_VALIDATION_FULL, Iso8601Date.OPTIONAL);
+		assertTrue(st, st == null);
+	}
+
+}
diff --git a/bundles/org.eclipse.uomo.util.tests/src/org/eclipse/uomo/util/test/numbers/RomanNumberDemos.java b/bundles/org.eclipse.uomo.util.tests/src/org/eclipse/uomo/util/test/numbers/RomanNumberDemos.java
index 0e9bad8..97bfa39 100644
--- a/bundles/org.eclipse.uomo.util.tests/src/org/eclipse/uomo/util/test/numbers/RomanNumberDemos.java
+++ b/bundles/org.eclipse.uomo.util.tests/src/org/eclipse/uomo/util/test/numbers/RomanNumberDemos.java
@@ -1,32 +1,32 @@
-/**
- * Copyright (c) 1996, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.util.test.numbers;
-
-import org.eclipse.uomo.util.numbers.ISpeller;
-import org.eclipse.uomo.util.numbers.impl.RomanNumberSpeller;
-
-public class RomanNumberDemos {
-
-	public static void main(String args[]) throws Exception {
-		System.out.println("Display massage number to Text!");
-		final ISpeller num = RomanNumberSpeller.of();
-		System.out.println("Spelling: " + num.spell(10) + ".");
-		System.out.println("Spelling: " + num.spell(15) + ".");
-		System.out.println("Spelling: " + num.spell(50) + ".");
-		System.out.println("Spelling: " + num.spell(99) + ".");
-		System.out.println("Spelling: " + num.spell(150) + ".");
-		System.out.println("Spelling: " + num.spell(234) + ".");
-		System.out.println("Spelling: " + num.spell(250) + ".");
-		System.out.println("Spelling: " + num.spell(2500) + ".");
-		System.out.println("Spelling: " + num.spell(3900) + ".");
-		// System.out.println("Spelling: " + num.spell(4000) + ".");
-	}
+/**
+ * Copyright (c) 1996, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.util.test.numbers;
+
+import org.eclipse.uomo.util.numbers.ISpeller;
+import org.eclipse.uomo.util.numbers.impl.RomanNumberSpeller;
+
+public class RomanNumberDemos {
+
+	public static void main(String args[]) throws Exception {
+		System.out.println("Display massage number to Text!");
+		final ISpeller num = RomanNumberSpeller.of();
+		System.out.println("Spelling: " + num.spell(10) + ".");
+		System.out.println("Spelling: " + num.spell(15) + ".");
+		System.out.println("Spelling: " + num.spell(50) + ".");
+		System.out.println("Spelling: " + num.spell(99) + ".");
+		System.out.println("Spelling: " + num.spell(150) + ".");
+		System.out.println("Spelling: " + num.spell(234) + ".");
+		System.out.println("Spelling: " + num.spell(250) + ".");
+		System.out.println("Spelling: " + num.spell(2500) + ".");
+		System.out.println("Spelling: " + num.spell(3900) + ".");
+		// System.out.println("Spelling: " + num.spell(4000) + ".");
+	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.uomo.util/.gitignore b/bundles/org.eclipse.uomo.util/.gitignore
index 2c36b17..21d5518 100644
--- a/bundles/org.eclipse.uomo.util/.gitignore
+++ b/bundles/org.eclipse.uomo.util/.gitignore
@@ -1,2 +1,2 @@
-/target
-/.settings
+/target
+/.settings
diff --git a/bundles/org.eclipse.uomo.util/META-INF/MANIFEST.MF b/bundles/org.eclipse.uomo.util/META-INF/MANIFEST.MF
index 7d9e29a..2f4298e 100644
--- a/bundles/org.eclipse.uomo.util/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.uomo.util/META-INF/MANIFEST.MF
@@ -1,17 +1,17 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: UOMo Utilities
-Bundle-SymbolicName: org.eclipse.uomo.util;singleton:=true
-Bundle-Version: 0.7.0.qualifier
-Bundle-Activator: org.eclipse.uomo.util.internal.UtilitiesPlugin
-Bundle-Vendor: Eclipse.org
-Export-Package: org.eclipse.uomo.util,
- org.eclipse.uomo.util.impl,
- org.eclipse.uomo.util.numbers
-Require-Bundle: org.eclipse.uomo.core;bundle-version="0.2.0",
- org.eclipse.core.runtime;bundle-version="3.6.0",
- org.apache.commons.lang;bundle-version="2.3.0",
- org.junit;bundle-version="4.8.2"
-Import-Package: org.eclipse.uomo.util
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: UOMo Utilities
+Bundle-SymbolicName: org.eclipse.uomo.util;singleton:=true
+Bundle-Version: 0.7.0.qualifier
+Bundle-Activator: org.eclipse.uomo.util.internal.UtilitiesPlugin
+Bundle-Vendor: Eclipse.org
+Export-Package: org.eclipse.uomo.util,
+ org.eclipse.uomo.util.impl,
+ org.eclipse.uomo.util.numbers
+Require-Bundle: org.eclipse.uomo.core;bundle-version="0.2.0",
+ org.eclipse.core.runtime;bundle-version="3.6.0",
+ org.apache.commons.lang;bundle-version="2.3.0",
+ org.junit;bundle-version="4.8.2"
+Import-Package: org.eclipse.uomo.util
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/Dictionary.java b/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/Dictionary.java
index 675493b..3edec8d 100644
--- a/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/Dictionary.java
+++ b/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/Dictionary.java
@@ -1,36 +1,36 @@
-/**
- * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.util;
-
-/**
- * @author Werner Keil
- * OSGi demo.
- * 
- * @deprecated change this into something more useful for UOM, e.g. Conversion
- */
-public interface Dictionary {
-	
-    /**
-     * Returns the language of the dictionary
-     *
-     * @return the language of the dictionary
-     */
-    public String getLanguage();
-	
-    /**
-     * Check for the existence of a word in the dictionary
-     * 
-     * @param word the word to be checked.
-     * @return true if the word is in the dictionary
-     */
-    public boolean check(String word);
-
-}
+/**
+ * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.util;
+
+/**
+ * @author Werner Keil
+ * OSGi demo.
+ * 
+ * @deprecated change this into something more useful for UOM, e.g. Conversion
+ */
+public interface Dictionary {
+	
+    /**
+     * Returns the language of the dictionary
+     *
+     * @return the language of the dictionary
+     */
+    public String getLanguage();
+	
+    /**
+     * Check for the existence of a word in the dictionary
+     * 
+     * @param word the word to be checked.
+     * @return true if the word is in the dictionary
+     */
+    public boolean check(String word);
+
+}
diff --git a/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/DictionaryService.java b/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/DictionaryService.java
index d7165b0..9519972 100644
--- a/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/DictionaryService.java
+++ b/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/DictionaryService.java
@@ -1,43 +1,43 @@
-/**
- * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.util;
-
-/**
- * @author Werner Keil
- * OSGi demo.
- * 
- * @deprecated change this into something more useful for UOM, e.g. ConversionService
- */
-public interface DictionaryService {
-	
-    /**
-     * Register a dictionary
-     * 
-     * @param dictionary the dictionary to be added.
-     */
-    public void registerDictionary(Dictionary dictionary);
-    
-    /**
-     * Remove a dictionary
-     * 
-     * @param dictionary the dictionary to be removed.
-     */
-    public void unregisterDictionary(Dictionary dictionary);
-	
-    /**
-     * Check for the existence of a word across all dictionaries
-     * 
-     * @param word the word to be checked.
-     * @return true if the word is in any dictionary
-     */
-    public boolean check(String word);
-
-}
+/**
+ * Copyright (c) 2005, 2010, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.util;
+
+/**
+ * @author Werner Keil
+ * OSGi demo.
+ * 
+ * @deprecated change this into something more useful for UOM, e.g. ConversionService
+ */
+public interface DictionaryService {
+	
+    /**
+     * Register a dictionary
+     * 
+     * @param dictionary the dictionary to be added.
+     */
+    public void registerDictionary(Dictionary dictionary);
+    
+    /**
+     * Remove a dictionary
+     * 
+     * @param dictionary the dictionary to be removed.
+     */
+    public void unregisterDictionary(Dictionary dictionary);
+	
+    /**
+     * Check for the existence of a word across all dictionaries
+     * 
+     * @param word the word to be checked.
+     * @return true if the word is in any dictionary
+     */
+    public boolean check(String word);
+
+}
diff --git a/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/Registry.java b/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/Registry.java
index b505f26..8f8a529 100644
--- a/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/Registry.java
+++ b/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/Registry.java
@@ -1,22 +1,22 @@
-/**
- * Copyright (c) 2011, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.util;
-
-/**
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * 
- * @param <V> the type of mapped values
- */
-public interface Registry<V> {
-	public boolean exists(String key);
-
-	public V get(String key);	
-}
+/**
+ * Copyright (c) 2011, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.util;
+
+/**
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * 
+ * @param <V> the type of mapped values
+ */
+public interface Registry<V> {
+	public boolean exists(String key);
+
+	public V get(String key);	
+}
diff --git a/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/impl/DictionaryImpl.java b/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/impl/DictionaryImpl.java
index 2ab994e..488b2cf 100644
--- a/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/impl/DictionaryImpl.java
+++ b/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/impl/DictionaryImpl.java
@@ -1,37 +1,37 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil and others - initial API and implementation
- */
-package org.eclipse.uomo.util.impl;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.uomo.util.Dictionary;
-
-@SuppressWarnings("deprecation")
-public class DictionaryImpl implements Dictionary {
-
-	private List<String> fWords = new ArrayList<String>(
-			Arrays.asList(new String[] { "osgi", "eclipse", "ucum" }));
-	private String fLanguage = "English";
-
-	public String getLanguage() {
-		return fLanguage;
-	}
-
-	public boolean check(String word) {
-		return fWords.contains(word);
-	}
-
-	public String toString() {
-		return fLanguage;
-	}
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil and others - initial API and implementation
+ */
+package org.eclipse.uomo.util.impl;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.uomo.util.Dictionary;
+
+@SuppressWarnings("deprecation")
+public class DictionaryImpl implements Dictionary {
+
+	private List<String> fWords = new ArrayList<String>(
+			Arrays.asList(new String[] { "osgi", "eclipse", "ucum" }));
+	private String fLanguage = "English";
+
+	public String getLanguage() {
+		return fLanguage;
+	}
+
+	public boolean check(String word) {
+		return fWords.contains(word);
+	}
+
+	public String toString() {
+		return fLanguage;
+	}
+}
diff --git a/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/impl/DictionaryServiceImpl.java b/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/impl/DictionaryServiceImpl.java
index f44dd24..0d24990 100644
--- a/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/impl/DictionaryServiceImpl.java
+++ b/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/impl/DictionaryServiceImpl.java
@@ -1,40 +1,40 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil and others - initial API and implementation
- */
-package org.eclipse.uomo.util.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.uomo.util.Dictionary;
-import org.eclipse.uomo.util.DictionaryService;
-
-public class DictionaryServiceImpl implements DictionaryService {
-
-	private final List<Dictionary> fDictionaries = new ArrayList<Dictionary>();
-
-	public void registerDictionary(Dictionary dictionary) {
-		fDictionaries.add(dictionary);
-	}
-
-	public void unregisterDictionary(Dictionary dictionary) {
-		fDictionaries.remove(dictionary);
-	}
-
-	public boolean check(String word) {
-		for (int i = 0; i < fDictionaries.size(); i++) {
-			Dictionary dictionary = (Dictionary) fDictionaries.get(i);
-			if (dictionary.check(word))
-				return true;
-		}
-		return false;
-	}
-
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil and others - initial API and implementation
+ */
+package org.eclipse.uomo.util.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.uomo.util.Dictionary;
+import org.eclipse.uomo.util.DictionaryService;
+
+public class DictionaryServiceImpl implements DictionaryService {
+
+	private final List<Dictionary> fDictionaries = new ArrayList<Dictionary>();
+
+	public void registerDictionary(Dictionary dictionary) {
+		fDictionaries.add(dictionary);
+	}
+
+	public void unregisterDictionary(Dictionary dictionary) {
+		fDictionaries.remove(dictionary);
+	}
+
+	public boolean check(String word) {
+		for (int i = 0; i < fDictionaries.size(); i++) {
+			Dictionary dictionary = (Dictionary) fDictionaries.get(i);
+			if (dictionary.check(word))
+				return true;
+		}
+		return false;
+	}
+
+}
diff --git a/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/numbers/RealFormatOptions.java b/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/numbers/RealFormatOptions.java
index cd31ece..04f1a7c 100644
--- a/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/numbers/RealFormatOptions.java
+++ b/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/numbers/RealFormatOptions.java
@@ -1,71 +1,71 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Grahame Grieve - initial API and implementation
- */
-package org.eclipse.uomo.util.numbers;
-
-final class RealFormatOptions extends DecimalFormatOptions {
-	
-	/**
-	 * null - exponent form is allowed
-	 * false - exponent form is not allowed
-	 * true - exponent form is required
-	 * 
-	 * FIXME change this to a more descriptive enum
-	 */
-	private Boolean exponent;
-	private boolean allowSpecial;
-	
-	/**
-	 * @param exponent
-	 * @param totalDigits
-	 * @param fractionDigits
-	 */
-	public RealFormatOptions(Boolean exponent, boolean allowSpecial, int totalDigits, int fractionDigits) {
-		super();
-		this.exponent = exponent;
-		this.totalDigits = totalDigits;
-		this.fractionDigits = fractionDigits;
-		this.allowSpecial = allowSpecial;
-	}
-
-	/**
-	 * @return the exponent
-	 */
-	public Boolean getExponent() {
-		return exponent;
-	}
-
-	/**
-	 * @param exponent the exponent to set
-	 */
-	public void setExponent(Boolean exponent) {
-		this.exponent = exponent;
-	}
-
-	/**
-	 * @return the allowSpecial
-	 */
-	public boolean isAllowSpecial() {
-		return allowSpecial;
-	}
-
-	/**
-	 * @param allowSpecial the allowSpecial to set
-	 */
-	public void setAllowSpecial(boolean allowSpecial) {
-		this.allowSpecial = allowSpecial;
-	}
-
-	public static RealFormatOptions allowComplex() {
-		return new RealFormatOptions(null, true, ANY_DIGITS, ANY_DIGITS);
-	}
-	
-	
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Grahame Grieve - initial API and implementation
+ */
+package org.eclipse.uomo.util.numbers;
+
+final class RealFormatOptions extends DecimalFormatOptions {
+	
+	/**
+	 * null - exponent form is allowed
+	 * false - exponent form is not allowed
+	 * true - exponent form is required
+	 * 
+	 * FIXME change this to a more descriptive enum
+	 */
+	private Boolean exponent;
+	private boolean allowSpecial;
+	
+	/**
+	 * @param exponent
+	 * @param totalDigits
+	 * @param fractionDigits
+	 */
+	public RealFormatOptions(Boolean exponent, boolean allowSpecial, int totalDigits, int fractionDigits) {
+		super();
+		this.exponent = exponent;
+		this.totalDigits = totalDigits;
+		this.fractionDigits = fractionDigits;
+		this.allowSpecial = allowSpecial;
+	}
+
+	/**
+	 * @return the exponent
+	 */
+	public Boolean getExponent() {
+		return exponent;
+	}
+
+	/**
+	 * @param exponent the exponent to set
+	 */
+	public void setExponent(Boolean exponent) {
+		this.exponent = exponent;
+	}
+
+	/**
+	 * @return the allowSpecial
+	 */
+	public boolean isAllowSpecial() {
+		return allowSpecial;
+	}
+
+	/**
+	 * @param allowSpecial the allowSpecial to set
+	 */
+	public void setAllowSpecial(boolean allowSpecial) {
+		this.allowSpecial = allowSpecial;
+	}
+
+	public static RealFormatOptions allowComplex() {
+		return new RealFormatOptions(null, true, ANY_DIGITS, ANY_DIGITS);
+	}
+	
+	
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/numbers/SpellService.java b/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/numbers/SpellService.java
index c5de471..fc3b8df 100644
--- a/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/numbers/SpellService.java
+++ b/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/numbers/SpellService.java
@@ -1,37 +1,37 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API
- */
-package org.eclipse.uomo.util.numbers;
-
-/**
- * SpellService is main engine for number spelling, text parsing and encoding
- * and validating.
- * 
- * @author Werner Keil
- * @version 1.1
- */
-public interface SpellService {
-
-	/**
-	 * Register a speller
-	 * 
-	 * @param speller
-	 *            the speller to be added.
-	 */
-	public void registerSpeller(ISpeller speller);
-
-	/**
-	 * Remove a speller
-	 * 
-	 * @param speller
-	 *            the speller to be removed.
-	 */
-	public void unregisterSpeller(ISpeller dictionary);
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API
+ */
+package org.eclipse.uomo.util.numbers;
+
+/**
+ * SpellService is main engine for number spelling, text parsing and encoding
+ * and validating.
+ * 
+ * @author Werner Keil
+ * @version 1.1
+ */
+public interface SpellService {
+
+	/**
+	 * Register a speller
+	 * 
+	 * @param speller
+	 *            the speller to be added.
+	 */
+	public void registerSpeller(ISpeller speller);
+
+	/**
+	 * Remove a speller
+	 * 
+	 * @param speller
+	 *            the speller to be removed.
+	 */
+	public void unregisterSpeller(ISpeller dictionary);
+}
diff --git a/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/numbers/impl/SpellServiceImpl.java b/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/numbers/impl/SpellServiceImpl.java
index 8e4227c..a8f97b1 100644
--- a/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/numbers/impl/SpellServiceImpl.java
+++ b/bundles/org.eclipse.uomo.util/src/main/java/org/eclipse/uomo/util/numbers/impl/SpellServiceImpl.java
@@ -1,33 +1,33 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.util.numbers.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.uomo.util.numbers.ISpeller;
-import org.eclipse.uomo.util.numbers.SpellService;
-
-public class SpellServiceImpl implements SpellService {
-
-	private final List<ISpeller> spellers = new ArrayList<ISpeller>();
-
-	@Override
-	public void registerSpeller(ISpeller speller) {
-		spellers.add(speller);
-	}
-
-	@Override
-	public void unregisterSpeller(ISpeller speller) {
-		spellers.remove(speller);
-	}
-
-}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.util.numbers.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.uomo.util.numbers.ISpeller;
+import org.eclipse.uomo.util.numbers.SpellService;
+
+public class SpellServiceImpl implements SpellService {
+
+	private final List<ISpeller> spellers = new ArrayList<ISpeller>();
+
+	@Override
+	public void registerSpeller(ISpeller speller) {
+		spellers.add(speller);
+	}
+
+	@Override
+	public void unregisterSpeller(ISpeller speller) {
+		spellers.remove(speller);
+	}
+
+}
diff --git a/bundles/org.eclipse.uomo.xml.tests/.classpath b/bundles/org.eclipse.uomo.xml.tests/.classpath
index 0b1bcf9..9bc33d3 100644
--- a/bundles/org.eclipse.uomo.xml.tests/.classpath
+++ b/bundles/org.eclipse.uomo.xml.tests/.classpath
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src/"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/bundles/org.eclipse.uomo.xml.tests/.gitignore b/bundles/org.eclipse.uomo.xml.tests/.gitignore
index ea8c4bf..0b42d2d 100644
--- a/bundles/org.eclipse.uomo.xml.tests/.gitignore
+++ b/bundles/org.eclipse.uomo.xml.tests/.gitignore
@@ -1 +1 @@
-/target
+/target
diff --git a/bundles/org.eclipse.uomo.xml.tests/.project b/bundles/org.eclipse.uomo.xml.tests/.project
index 1d1e8fe..3d8fa9a 100644
--- a/bundles/org.eclipse.uomo.xml.tests/.project
+++ b/bundles/org.eclipse.uomo.xml.tests/.project
@@ -1,34 +1,34 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.uomo.util.tests</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.uomo.util.tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/bundles/org.eclipse.uomo.xml.tests/META-INF/MANIFEST.MF b/bundles/org.eclipse.uomo.xml.tests/META-INF/MANIFEST.MF
index b4a6d87..bb287f3 100644
--- a/bundles/org.eclipse.uomo.xml.tests/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.uomo.xml.tests/META-INF/MANIFEST.MF
@@ -1,11 +1,11 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: UOMo XML Tests
-Bundle-SymbolicName: org.eclipse.uomo.xml.tests
-Bundle-Version: 0.7.0.qualifier
-Bundle-Vendor: Eclipse.org
-Fragment-Host: org.eclipse.uomo.util;bundle-version="0.7.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Export-Package: org.eclipse.uomo.xml.test
-Require-Bundle: org.junit;bundle-version="4.8.2",
- org.eclipse.uomo.xml;bundle-version="0.7.0"
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: UOMo XML Tests
+Bundle-SymbolicName: org.eclipse.uomo.xml.tests
+Bundle-Version: 0.7.0.qualifier
+Bundle-Vendor: Eclipse.org
+Fragment-Host: org.eclipse.uomo.util;bundle-version="0.7.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Export-Package: org.eclipse.uomo.xml.test
+Require-Bundle: org.junit;bundle-version="4.8.2",
+ org.eclipse.uomo.xml;bundle-version="0.7.0"
diff --git a/bundles/org.eclipse.uomo.xml.tests/build.properties b/bundles/org.eclipse.uomo.xml.tests/build.properties
index ced5f40..c4e35e4 100644
--- a/bundles/org.eclipse.uomo.xml.tests/build.properties
+++ b/bundles/org.eclipse.uomo.xml.tests/build.properties
@@ -1,4 +1,4 @@
-source.. = src/
-output.. = target/classes
-bin.includes = META-INF/,\
-               .
+source.. = src/
+output.. = target/classes
+bin.includes = META-INF/,\
+               .
diff --git a/bundles/org.eclipse.uomo.xml/.classpath b/bundles/org.eclipse.uomo.xml/.classpath
index 5aff1fe..17054ca 100644
--- a/bundles/org.eclipse.uomo.xml/.classpath
+++ b/bundles/org.eclipse.uomo.xml/.classpath
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry exported="true" kind="lib" path="libs/xmlpull_1_1_3_4b.jar"/>
-	<classpathentry exported="true" kind="lib" path="libs/xpp3_min-1.1.3.4.O.jar"/>
-	<classpathentry kind="src" path="src/main/java/"/>
-	<classpathentry kind="src" path="src/main/resources/"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry exported="true" kind="lib" path="libs/xmlpull_1_1_3_4b.jar"/>
+	<classpathentry exported="true" kind="lib" path="libs/xpp3_min-1.1.3.4.O.jar"/>
+	<classpathentry kind="src" path="src/main/java/"/>
+	<classpathentry kind="src" path="src/main/resources/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/bundles/org.eclipse.uomo.xml/.gitignore b/bundles/org.eclipse.uomo.xml/.gitignore
index e7da900..1a315ce 100644
--- a/bundles/org.eclipse.uomo.xml/.gitignore
+++ b/bundles/org.eclipse.uomo.xml/.gitignore
@@ -1,3 +1,3 @@
-/target
-/.settings
-/target
+/target
+/.settings
+/target
diff --git a/bundles/org.eclipse.uomo.xml/.springBeans b/bundles/org.eclipse.uomo.xml/.springBeans
index 6c6cb5a..ef666ef 100644
--- a/bundles/org.eclipse.uomo.xml/.springBeans
+++ b/bundles/org.eclipse.uomo.xml/.springBeans
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beansProjectDescription>
-	<version>1</version>
-	<pluginVersion><![CDATA[2.5.0.201010221000-RELEASE]]></pluginVersion>
-	<configSuffixes>
-		<configSuffix><![CDATA[xml]]></configSuffix>
-	</configSuffixes>
-	<enableImports><![CDATA[false]]></enableImports>
-	<configs>
-	</configs>
-	<configSets>
-	</configSets>
-</beansProjectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.5.0.201010221000-RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/bundles/org.eclipse.uomo.xml/META-INF/MANIFEST.MF b/bundles/org.eclipse.uomo.xml/META-INF/MANIFEST.MF
index 8b477ac..737eb76 100644
--- a/bundles/org.eclipse.uomo.xml/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.uomo.xml/META-INF/MANIFEST.MF
@@ -1,24 +1,24 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: UOMo XML
-Bundle-SymbolicName: org.eclipse.uomo.xml
-Bundle-Version: 0.7.0.qualifier
-Require-Bundle: org.eclipse.uomo.core;bundle-version="0.7.0",
- org.apache.commons.lang;bundle-version="2.6.0",
- org.apache.xerces,
- org.junit;bundle-version="4.8.2"
-Bundle-Vendor: Eclipse.org
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Bundle-ClassPath: libs/xmlpull_1_1_3_4b.jar, libs/xpp3_min-1.1.3.4.O.jar,
- .
-Export-Package: org.eclipse.uomo.xml,
- org.eclipse.uomo.xml.impl;
-  uses:="org.apache.xerces.parsers,
-   org.xmlpull.v1,
-   org.apache.xerces.xni,
-   org.eclipse.uomo.xml,
-   org.xml.sax.helpers,
-   org.w3c.dom,
-   org.xml.sax",
- org.xmlpull.mxp1,
- org.xmlpull.v1
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: UOMo XML
+Bundle-SymbolicName: org.eclipse.uomo.xml
+Bundle-Version: 0.7.0.qualifier
+Require-Bundle: org.eclipse.uomo.core;bundle-version="0.7.0",
+ org.apache.commons.lang;bundle-version="2.6.0",
+ org.apache.xerces,
+ org.junit;bundle-version="4.8.2"
+Bundle-Vendor: Eclipse.org
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ClassPath: libs/xmlpull_1_1_3_4b.jar, libs/xpp3_min-1.1.3.4.O.jar,
+ .
+Export-Package: org.eclipse.uomo.xml,
+ org.eclipse.uomo.xml.impl;
+  uses:="org.apache.xerces.parsers,
+   org.xmlpull.v1,
+   org.apache.xerces.xni,
+   org.eclipse.uomo.xml,
+   org.xml.sax.helpers,
+   org.w3c.dom,
+   org.xml.sax",
+ org.xmlpull.mxp1,
+ org.xmlpull.v1
diff --git a/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/XMLMessages.java b/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/XMLMessages.java
index c58f2fd..c860fc5 100644
--- a/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/XMLMessages.java
+++ b/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/XMLMessages.java
@@ -1,15 +1,15 @@
-package org.eclipse.uomo.xml;
-
-import org.eclipse.osgi.util.NLS;
-
-public final class XMLMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.uomo.xml.messages"; //$NON-NLS-1$
-	public static String XMLObjectParsers_stackUnderflow;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, XMLMessages.class);
-	}
-
-	private XMLMessages() {
-	}
-}
+package org.eclipse.uomo.xml;
+
+import org.eclipse.osgi.util.NLS;
+
+public final class XMLMessages extends NLS {
+	private static final String BUNDLE_NAME = "org.eclipse.uomo.xml.messages"; //$NON-NLS-1$
+	public static String XMLObjectParsers_stackUnderflow;
+	static {
+		// initialize resource bundle
+		NLS.initializeMessages(BUNDLE_NAME, XMLMessages.class);
+	}
+
+	private XMLMessages() {
+	}
+}
diff --git a/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/DOMXMLWriter.java b/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/DOMXMLWriter.java
index c01bec4..d89ef4f 100644
--- a/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/DOMXMLWriter.java
+++ b/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/DOMXMLWriter.java
@@ -1,527 +1,527 @@
-/*******************************************************************************
- * Crown Copyright (c) 2009, 2009, Copyright (c) 2009, 2009 Kestral Computing.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *    Kestral Computing - initial API and implementation
- *******************************************************************************/
-package org.eclipse.uomo.xml.impl;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Stack;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-import org.eclipse.uomo.xml.DOMUtil;
-import org.eclipse.uomo.xml.IXMLWriter;
-import org.eclipse.uomo.xml.XMLUtil;
-import org.w3c.dom.Comment;
-import org.w3c.dom.Document;
-import org.w3c.dom.DocumentFragment;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * A DOM-base XML writer
- * 
- * @author dennisn
- *
- */
-public class DOMXMLWriter implements IXMLWriter {
-	
-	/**
-	 * The internal document
-	 */
-	private Document doc = null;
-	
-	private boolean isPretty = true;
-	
-	// the current stack of element
-	private Stack<Node> current = new Stack<Node>();
-	
-	// defined attributes for the new coming element
-	private Map attributes = new HashMap();
-	
-	// the defined namespace for the new coming element
-	private Map definedNS = new HashMap();
-	
-	private DocumentFragment commentBlock = null;
-	
-	public DOMXMLWriter() throws ParserConfigurationException {
-		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
-		builderFactory.setNamespaceAware(true);
-		DocumentBuilder docBuilder = builderFactory.newDocumentBuilder();
-		doc = docBuilder.newDocument();
-	}
-	
-	public DOMXMLWriter(Document doc) {
-		this.doc = doc;
-	}
-	
-	/**
-	 * @return the internal document
-	 * NOTE: be careful when changing the internal document, as it may
-	 * cause error for the writer
-	 */
-	public Document getDOMDocument() {
-		return doc;
-	}
-	
-	public Element getCurrentElement() {
-		return (Element) current.peek();
-	}
-	
-	protected boolean condition(boolean bTest, String message) throws IOException {
-		if (!bTest)
-			throw new IOException(message);
-		return bTest;
-	}
-	
-	private void addAttribute(String name, String value) throws IOException {
-		addAttribute(name, value, false);
-	}
-
-	private void addAttribute(String name, String value, boolean isNoLines) throws IOException {
-		if (!XMLUtil.isNMToken(name))
-			throw new IOException("XML name "+name+" is not valid");
-
-		condition(!attributes.containsKey(name), "attempt to define attribute with name "+name+" more than once");
-		attributes.put(name, XMLUtil.escapeXML(value, null, isNoLines));
-	}
-	
-	private void defineNamespace(String namespace, String prefix) {
-		if (namespace != null) {
-			if (prefix == null)
-				prefix = "";
-			
-			definedNS.put(prefix, namespace);
-		}
-	}
-	
-	private String getPrefixForNamespace(String namespace) throws IOException {
-		if ("http://www.w3.org/XML/1998/namespace".equals(namespace))
-			return "xml:";
-
-		String prefix = null;
-		if (definedNS.containsValue(namespace)) {
-			Iterator iter = definedNS.keySet().iterator();
-			while (prefix == null && iter.hasNext()) {
-				Object k = iter.next();
-				if (definedNS.get(k).equals(namespace))
-					prefix = k.toString();
-			}
-		}
-		else if (current.size() > 0)
-			prefix = DOMUtil.lookupPrefixForNamespace((Element) current.peek(), namespace);
-		
-		if (prefix == null)
-			throw new IOException("Namespace "+namespace+" is not defined");
-		return prefix + ":";
-	}
-	
-	private String getNamespaceForPrefix(String prefix) throws IOException {
-		if ("xml".equals(prefix))
-			return "http://www.w3.org/XML/1998/namespace";
-
-		String result = null;
-		if (definedNS.containsKey(prefix))
-			result = definedNS.get(prefix).toString();
-		else if (current.size() > 0)
-			prefix = DOMUtil.lookupNamespaceForPrefix((Element) current.peek(), prefix);
-		return result == null ? "" : result;
-	}
-	
-	private void checkInElement() throws IOException {
-		condition(current != null && current.size() > 0, "Not in an element");
-	}
-
-	// IXMLWriter methods
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#abbreviationDefined(java.lang.String)
-	 */
-	public boolean abbreviationDefined(String abbreviation) {
-		return definedNS.containsKey(abbreviation) 
-			|| (current.size() > 0 && DOMUtil.lookupNamespaceForPrefix(getCurrentElement(), abbreviation) != null);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attribute(java.lang.String, java.lang.String, java.lang.String, boolean)
-	 */
-	public void attribute(String namespace, String name, String value, boolean onlyIfNotEmpty) throws IOException {
-		if (!onlyIfNotEmpty || value != null && !value.equals(""))
-			attribute(namespace, name, value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attribute(java.lang.String, java.lang.String, java.lang.String)
-	 */
-	public void attribute(String namespace, String name, String value) throws IOException {
-		if (namespace == null || namespace.equals("")) 
-			addAttribute(name, value);
-		else
-			addAttribute(getPrefixForNamespace(namespace)+name, value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attribute(java.lang.String, java.lang.String, boolean)
-	 */
-	public void attribute(String name, String value, boolean onlyIfNotEmpty) throws IOException {
-		if (!onlyIfNotEmpty || value != null && !value.equals(""))
-			attribute(name, value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attribute(java.lang.String, java.lang.String)
-	 */
-	public void attribute(String name, String value) throws IOException {
-		addAttribute(name, value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attributeNoLines(java.lang.String, java.lang.String)
-	 */
-	public void attributeNoLines(String name, String value) throws IOException {
-		addAttribute(name, value, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#cData(java.lang.String)
-	 */
-	public void cData(String text) throws IOException {
-		checkInElement();
-		getCurrentElement().appendChild(doc.createCDATASection(text));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#close(java.lang.String)
-	 */
-	public void close(String name) throws IOException {
-		if (current.size() == 0)
-			throw new IOException("Unable to close null|"+name+", nothing to close");
-		if (!getCurrentElement().getNodeName().equals(name))
-			throw new IOException("Unable to close null|"+name+", found "+getCurrentElement().getNodeName());
-		close();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#close(java.lang.String, java.lang.String)
-	 */
-	public void close(String namespace, String name) throws IOException {
-		if (current.size() == 0)
-			throw new IOException("Unable to close null|"+name+", nothing to close");
-		// assume current is DOM level 3
-		Element ele = getCurrentElement();
-		if (!namespace.equals(ele.getNamespaceURI()) || !name.equals(ele.getLocalName()))
-			throw new IOException("Unable to close "+namespace+"|"+name+", found "+ele.getNamespaceURI() +"|"+ele.getLocalName());
-		close();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#close()
-	 */
-	public void close() throws IOException {
-		checkInElement();
-		current.pop();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#closeToLevel(int)
-	 */
-	public void closeToLevel(int count) throws IOException {
-		while (current.size() > count)
-			close();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#comment(java.lang.String, boolean)
-	 */
-	public void comment(String comment, boolean doPretty) throws IOException {
-		Comment c = doc.createComment(comment);
-		getCurrentElement().appendChild(c);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String, java.lang.String, boolean)
-	 */
-	public void element(String namespace, String name, String content, boolean onlyIfNotEmpty) throws IOException {
-		if (!onlyIfNotEmpty || content != null && !content.equals(""))
-			element(namespace, name, content);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
-	 */
-	public void element(String namespace, String name, String content, String comment) throws IOException {
-		if (!XMLUtil.isNMToken(name))
-			throw new IOException("XML name "+name+" is not valid");
-		open(namespace, name, comment);
-		text(content);
-		close();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String, java.lang.String)
-	 */
-	public void element(String namespace, String name, String content) throws IOException {
-		if (!XMLUtil.isNMToken(name))
-			throw new IOException("XML name "+name+" is not valid");
-		open(namespace, name);
-		text(content);
-		close();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String, boolean)
-	 */
-	public void element(String name, String content, boolean onlyIfNotEmpty) throws IOException {
-		if (!onlyIfNotEmpty || content != null && !content.equals(""))
-			element(null, name, content);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String)
-	 */
-	public void element(String name, String content) throws IOException {
-		element(null, name, content);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#endCommentBlock()
-	 */
-	public void endCommentBlock() throws IOException {
-		if (commentBlock == null)
-			throw new IOException("Cannot close a comment block when none existed");
-		else if (getCurrentElement().getParentNode() != commentBlock)
-			throw new IOException("Cannot close a comment block when it's still opened");
-		
-		ByteArrayOutputStream temp = new ByteArrayOutputStream();
-		try {
-			// re-create the comment nodes
-			NodeList children = getCurrentElement().getChildNodes();
-			DocumentFragment frag = doc.createDocumentFragment();
-			for (int i = 0; i < children.getLength(); i++) 
-				frag.appendChild(children.item(i));
-			
-			// init DOM->String transformer
-			Transformer trans = TransformerFactory.newInstance().newTransformer();
-			trans.setOutputProperty(OutputKeys.STANDALONE, "no");
-			trans.setOutputProperty(OutputKeys.INDENT, "yes");
-			trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
-
-			// convert from DOM to string comment
-			
-			trans.transform(new DOMSource(frag), new StreamResult(temp));
-		}
-		catch (Exception e) {
-			throw new IOException(e.getLocalizedMessage());
-		}
-		finally {
-			current.pop();
-			commentBlock = null;
-		}
-		comment(temp.toString(), true);
-	}
-
-//	/* (non-Javadoc)
-//	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#escapedText(java.lang.String)
-//	 */
-//	public void escapedText(String content) throws IOException {
-//		checkInElement();
-//		text(content);
-//	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#getDefaultNamespace()
-	 */
-	public String getDefaultNamespace() {
-		String result = null;
-		if (definedNS.size() > 0) {
-			try {
-				result = getNamespaceForPrefix("");
-			} catch (IOException e) {
-				// do nothing
-			}
-		}
-		
-		if (result == null && current.size() > 0)
-			result = DOMUtil.lookupNamespaceForPrefix(getCurrentElement(), "");
-		
-		return result == null ? "": result;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#isPretty()
-	 */
-	public boolean isPretty() throws IOException {
-		return isPretty;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#namespace(java.lang.String)
-	 */
-	public void namespace(String namespace) throws IOException {
-		if (!namespaceDefined(namespace)) {
-			int index = 0;
-			while (abbreviationDefined("ns"+Integer.toString(index))) 
-				index++;
-			defineNamespace(namespace, "ns"+Integer.toString(index));
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#namespace(java.lang.String, java.lang.String)
-	 */
-	public void namespace(String namespace, String prefix) throws IOException {
-		String ns = getNamespaceForPrefix(prefix);
-		if (ns == null || !ns.equals(namespace))
-			defineNamespace(namespace, prefix);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#namespaceDefined(java.lang.String)
-	 */
-	public boolean namespaceDefined(String namespace) {
-		try {
-			return getPrefixForNamespace(namespace) != null;
-		} catch (IOException e) {
-			return false;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#open(java.lang.String, java.lang.String)
-	 */
-	public void open(String namespace, String name) throws IOException {
-		open(namespace, name, null);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#open(java.lang.String, java.lang.String, java.lang.String)
-	 */
-	public void open(String namespace, String name, String comment) throws IOException {
-		if (!XMLUtil.isNMToken(name))
-			throw new IOException("XML name "+name+" is not valid");
-		if (name == null)
-			throw new IOException("XML name is null");
-
-		Element ele;
-		if (namespace != null) {
-			name = getPrefixForNamespace(namespace) + name;
-			ele = doc.createElementNS(namespace, name);
-		}
-		else if (getDefaultNamespace().length() > 0)
-			ele = doc.createElementNS(getDefaultNamespace(), name);
-		else
-			ele = doc.createElement(name);
-		defineAttributes(ele);
-		defineNamespaces(ele);
-		if (current.size() == 0)
-			doc.appendChild(ele);
-		else
-			getCurrentElement().appendChild(ele);
-		current.push(ele);
-		if (comment != null) comment(comment, true);
-	}
-
-	private void defineNamespaces(Element ele) {
-		Iterator<?> iter = definedNS.keySet().iterator();
-		while (iter.hasNext()) {
-			Object k = iter.next();
-			ele.setAttribute("xmlns:" + k.toString(), definedNS.get(k).toString());
-		}
-		definedNS.clear();
-	}
-
-	private void defineAttributes(Element ele) {
-		Iterator<?> iter = attributes.keySet().iterator();
-		while (iter.hasNext()) {
-			Object k = iter.next();
-			ele.setAttribute(k.toString(), attributes.get(k).toString());
-		}
-		attributes.clear();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#open(java.lang.String)
-	 */
-	public void open(String name) throws IOException {
-		open(null, name);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#setDefaultNamespace(java.lang.String)
-	 */
-	public void setDefaultNamespace(String namespace) throws IOException {
-		if ((namespace == null && getDefaultNamespace() != null) ||
-				(namespace != null && !namespace.equals(getDefaultNamespace())))
-			defineNamespace(namespace, "");
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#setPretty(boolean)
-	 */
-	public void setPretty(boolean pretty) throws IOException {
-		this.isPretty = pretty;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#start()
-	 */
-	public void start() throws IOException {
-		// dont need to do anything
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#startCommentBlock()
-	 */
-	public void startCommentBlock() throws IOException {
-		if (commentBlock != null)
-			throw new IOException("Cannot nest comments");
-		/* we start a comment block by create a document fragment with 1 element root: commentRoot
-		 * Further node will be add to be children of this element root.
-		 */
-		commentBlock = doc.createDocumentFragment();
-		Node node = doc.createElement("commentRoot");
-		commentBlock.appendChild(node);
-		current.push(node);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#text(java.lang.String)
-	 */
-	public void text(String content) throws IOException {
-		text(content, false);
-	}
-	
-	public void text(String content, boolean dontEscape) throws IOException {
-		if (!dontEscape)
-			content = XMLUtil.escapeXML(content, null, false);
-		checkInElement();
-		Node node = doc.createTextNode(content);
-		getCurrentElement().appendChild(node);	
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#writeBytes(byte[])
-	 */
-	public void writeBytes(byte[] bytes) throws IOException {
-		text(new String(bytes));
-	}
-
-}
+/*******************************************************************************
+ * Crown Copyright (c) 2009, 2009, Copyright (c) 2009, 2009 Kestral Computing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *    Kestral Computing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.uomo.xml.impl;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Stack;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.eclipse.uomo.xml.DOMUtil;
+import org.eclipse.uomo.xml.IXMLWriter;
+import org.eclipse.uomo.xml.XMLUtil;
+import org.w3c.dom.Comment;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentFragment;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * A DOM-base XML writer
+ * 
+ * @author dennisn
+ *
+ */
+public class DOMXMLWriter implements IXMLWriter {
+	
+	/**
+	 * The internal document
+	 */
+	private Document doc = null;
+	
+	private boolean isPretty = true;
+	
+	// the current stack of element
+	private Stack<Node> current = new Stack<Node>();
+	
+	// defined attributes for the new coming element
+	private Map attributes = new HashMap();
+	
+	// the defined namespace for the new coming element
+	private Map definedNS = new HashMap();
+	
+	private DocumentFragment commentBlock = null;
+	
+	public DOMXMLWriter() throws ParserConfigurationException {
+		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
+		builderFactory.setNamespaceAware(true);
+		DocumentBuilder docBuilder = builderFactory.newDocumentBuilder();
+		doc = docBuilder.newDocument();
+	}
+	
+	public DOMXMLWriter(Document doc) {
+		this.doc = doc;
+	}
+	
+	/**
+	 * @return the internal document
+	 * NOTE: be careful when changing the internal document, as it may
+	 * cause error for the writer
+	 */
+	public Document getDOMDocument() {
+		return doc;
+	}
+	
+	public Element getCurrentElement() {
+		return (Element) current.peek();
+	}
+	
+	protected boolean condition(boolean bTest, String message) throws IOException {
+		if (!bTest)
+			throw new IOException(message);
+		return bTest;
+	}
+	
+	private void addAttribute(String name, String value) throws IOException {
+		addAttribute(name, value, false);
+	}
+
+	private void addAttribute(String name, String value, boolean isNoLines) throws IOException {
+		if (!XMLUtil.isNMToken(name))
+			throw new IOException("XML name "+name+" is not valid");
+
+		condition(!attributes.containsKey(name), "attempt to define attribute with name "+name+" more than once");
+		attributes.put(name, XMLUtil.escapeXML(value, null, isNoLines));
+	}
+	
+	private void defineNamespace(String namespace, String prefix) {
+		if (namespace != null) {
+			if (prefix == null)
+				prefix = "";
+			
+			definedNS.put(prefix, namespace);
+		}
+	}
+	
+	private String getPrefixForNamespace(String namespace) throws IOException {
+		if ("http://www.w3.org/XML/1998/namespace".equals(namespace))
+			return "xml:";
+
+		String prefix = null;
+		if (definedNS.containsValue(namespace)) {
+			Iterator iter = definedNS.keySet().iterator();
+			while (prefix == null && iter.hasNext()) {
+				Object k = iter.next();
+				if (definedNS.get(k).equals(namespace))
+					prefix = k.toString();
+			}
+		}
+		else if (current.size() > 0)
+			prefix = DOMUtil.lookupPrefixForNamespace((Element) current.peek(), namespace);
+		
+		if (prefix == null)
+			throw new IOException("Namespace "+namespace+" is not defined");
+		return prefix + ":";
+	}
+	
+	private String getNamespaceForPrefix(String prefix) throws IOException {
+		if ("xml".equals(prefix))
+			return "http://www.w3.org/XML/1998/namespace";
+
+		String result = null;
+		if (definedNS.containsKey(prefix))
+			result = definedNS.get(prefix).toString();
+		else if (current.size() > 0)
+			prefix = DOMUtil.lookupNamespaceForPrefix((Element) current.peek(), prefix);
+		return result == null ? "" : result;
+	}
+	
+	private void checkInElement() throws IOException {
+		condition(current != null && current.size() > 0, "Not in an element");
+	}
+
+	// IXMLWriter methods
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#abbreviationDefined(java.lang.String)
+	 */
+	public boolean abbreviationDefined(String abbreviation) {
+		return definedNS.containsKey(abbreviation) 
+			|| (current.size() > 0 && DOMUtil.lookupNamespaceForPrefix(getCurrentElement(), abbreviation) != null);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attribute(java.lang.String, java.lang.String, java.lang.String, boolean)
+	 */
+	public void attribute(String namespace, String name, String value, boolean onlyIfNotEmpty) throws IOException {
+		if (!onlyIfNotEmpty || value != null && !value.equals(""))
+			attribute(namespace, name, value);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attribute(java.lang.String, java.lang.String, java.lang.String)
+	 */
+	public void attribute(String namespace, String name, String value) throws IOException {
+		if (namespace == null || namespace.equals("")) 
+			addAttribute(name, value);
+		else
+			addAttribute(getPrefixForNamespace(namespace)+name, value);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attribute(java.lang.String, java.lang.String, boolean)
+	 */
+	public void attribute(String name, String value, boolean onlyIfNotEmpty) throws IOException {
+		if (!onlyIfNotEmpty || value != null && !value.equals(""))
+			attribute(name, value);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attribute(java.lang.String, java.lang.String)
+	 */
+	public void attribute(String name, String value) throws IOException {
+		addAttribute(name, value);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attributeNoLines(java.lang.String, java.lang.String)
+	 */
+	public void attributeNoLines(String name, String value) throws IOException {
+		addAttribute(name, value, true);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#cData(java.lang.String)
+	 */
+	public void cData(String text) throws IOException {
+		checkInElement();
+		getCurrentElement().appendChild(doc.createCDATASection(text));
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#close(java.lang.String)
+	 */
+	public void close(String name) throws IOException {
+		if (current.size() == 0)
+			throw new IOException("Unable to close null|"+name+", nothing to close");
+		if (!getCurrentElement().getNodeName().equals(name))
+			throw new IOException("Unable to close null|"+name+", found "+getCurrentElement().getNodeName());
+		close();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#close(java.lang.String, java.lang.String)
+	 */
+	public void close(String namespace, String name) throws IOException {
+		if (current.size() == 0)
+			throw new IOException("Unable to close null|"+name+", nothing to close");
+		// assume current is DOM level 3
+		Element ele = getCurrentElement();
+		if (!namespace.equals(ele.getNamespaceURI()) || !name.equals(ele.getLocalName()))
+			throw new IOException("Unable to close "+namespace+"|"+name+", found "+ele.getNamespaceURI() +"|"+ele.getLocalName());
+		close();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#close()
+	 */
+	public void close() throws IOException {
+		checkInElement();
+		current.pop();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#closeToLevel(int)
+	 */
+	public void closeToLevel(int count) throws IOException {
+		while (current.size() > count)
+			close();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#comment(java.lang.String, boolean)
+	 */
+	public void comment(String comment, boolean doPretty) throws IOException {
+		Comment c = doc.createComment(comment);
+		getCurrentElement().appendChild(c);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String, java.lang.String, boolean)
+	 */
+	public void element(String namespace, String name, String content, boolean onlyIfNotEmpty) throws IOException {
+		if (!onlyIfNotEmpty || content != null && !content.equals(""))
+			element(namespace, name, content);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
+	 */
+	public void element(String namespace, String name, String content, String comment) throws IOException {
+		if (!XMLUtil.isNMToken(name))
+			throw new IOException("XML name "+name+" is not valid");
+		open(namespace, name, comment);
+		text(content);
+		close();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String, java.lang.String)
+	 */
+	public void element(String namespace, String name, String content) throws IOException {
+		if (!XMLUtil.isNMToken(name))
+			throw new IOException("XML name "+name+" is not valid");
+		open(namespace, name);
+		text(content);
+		close();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String, boolean)
+	 */
+	public void element(String name, String content, boolean onlyIfNotEmpty) throws IOException {
+		if (!onlyIfNotEmpty || content != null && !content.equals(""))
+			element(null, name, content);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String)
+	 */
+	public void element(String name, String content) throws IOException {
+		element(null, name, content);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#endCommentBlock()
+	 */
+	public void endCommentBlock() throws IOException {
+		if (commentBlock == null)
+			throw new IOException("Cannot close a comment block when none existed");
+		else if (getCurrentElement().getParentNode() != commentBlock)
+			throw new IOException("Cannot close a comment block when it's still opened");
+		
+		ByteArrayOutputStream temp = new ByteArrayOutputStream();
+		try {
+			// re-create the comment nodes
+			NodeList children = getCurrentElement().getChildNodes();
+			DocumentFragment frag = doc.createDocumentFragment();
+			for (int i = 0; i < children.getLength(); i++) 
+				frag.appendChild(children.item(i));
+			
+			// init DOM->String transformer
+			Transformer trans = TransformerFactory.newInstance().newTransformer();
+			trans.setOutputProperty(OutputKeys.STANDALONE, "no");
+			trans.setOutputProperty(OutputKeys.INDENT, "yes");
+			trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+
+			// convert from DOM to string comment
+			
+			trans.transform(new DOMSource(frag), new StreamResult(temp));
+		}
+		catch (Exception e) {
+			throw new IOException(e.getLocalizedMessage());
+		}
+		finally {
+			current.pop();
+			commentBlock = null;
+		}
+		comment(temp.toString(), true);
+	}
+
+//	/* (non-Javadoc)
+//	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#escapedText(java.lang.String)
+//	 */
+//	public void escapedText(String content) throws IOException {
+//		checkInElement();
+//		text(content);
+//	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#getDefaultNamespace()
+	 */
+	public String getDefaultNamespace() {
+		String result = null;
+		if (definedNS.size() > 0) {
+			try {
+				result = getNamespaceForPrefix("");
+			} catch (IOException e) {
+				// do nothing
+			}
+		}
+		
+		if (result == null && current.size() > 0)
+			result = DOMUtil.lookupNamespaceForPrefix(getCurrentElement(), "");
+		
+		return result == null ? "": result;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#isPretty()
+	 */
+	public boolean isPretty() throws IOException {
+		return isPretty;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#namespace(java.lang.String)
+	 */
+	public void namespace(String namespace) throws IOException {
+		if (!namespaceDefined(namespace)) {
+			int index = 0;
+			while (abbreviationDefined("ns"+Integer.toString(index))) 
+				index++;
+			defineNamespace(namespace, "ns"+Integer.toString(index));
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#namespace(java.lang.String, java.lang.String)
+	 */
+	public void namespace(String namespace, String prefix) throws IOException {
+		String ns = getNamespaceForPrefix(prefix);
+		if (ns == null || !ns.equals(namespace))
+			defineNamespace(namespace, prefix);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#namespaceDefined(java.lang.String)
+	 */
+	public boolean namespaceDefined(String namespace) {
+		try {
+			return getPrefixForNamespace(namespace) != null;
+		} catch (IOException e) {
+			return false;
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#open(java.lang.String, java.lang.String)
+	 */
+	public void open(String namespace, String name) throws IOException {
+		open(namespace, name, null);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#open(java.lang.String, java.lang.String, java.lang.String)
+	 */
+	public void open(String namespace, String name, String comment) throws IOException {
+		if (!XMLUtil.isNMToken(name))
+			throw new IOException("XML name "+name+" is not valid");
+		if (name == null)
+			throw new IOException("XML name is null");
+
+		Element ele;
+		if (namespace != null) {
+			name = getPrefixForNamespace(namespace) + name;
+			ele = doc.createElementNS(namespace, name);
+		}
+		else if (getDefaultNamespace().length() > 0)
+			ele = doc.createElementNS(getDefaultNamespace(), name);
+		else
+			ele = doc.createElement(name);
+		defineAttributes(ele);
+		defineNamespaces(ele);
+		if (current.size() == 0)
+			doc.appendChild(ele);
+		else
+			getCurrentElement().appendChild(ele);
+		current.push(ele);
+		if (comment != null) comment(comment, true);
+	}
+
+	private void defineNamespaces(Element ele) {
+		Iterator<?> iter = definedNS.keySet().iterator();
+		while (iter.hasNext()) {
+			Object k = iter.next();
+			ele.setAttribute("xmlns:" + k.toString(), definedNS.get(k).toString());
+		}
+		definedNS.clear();
+	}
+
+	private void defineAttributes(Element ele) {
+		Iterator<?> iter = attributes.keySet().iterator();
+		while (iter.hasNext()) {
+			Object k = iter.next();
+			ele.setAttribute(k.toString(), attributes.get(k).toString());
+		}
+		attributes.clear();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#open(java.lang.String)
+	 */
+	public void open(String name) throws IOException {
+		open(null, name);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#setDefaultNamespace(java.lang.String)
+	 */
+	public void setDefaultNamespace(String namespace) throws IOException {
+		if ((namespace == null && getDefaultNamespace() != null) ||
+				(namespace != null && !namespace.equals(getDefaultNamespace())))
+			defineNamespace(namespace, "");
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#setPretty(boolean)
+	 */
+	public void setPretty(boolean pretty) throws IOException {
+		this.isPretty = pretty;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#start()
+	 */
+	public void start() throws IOException {
+		// dont need to do anything
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#startCommentBlock()
+	 */
+	public void startCommentBlock() throws IOException {
+		if (commentBlock != null)
+			throw new IOException("Cannot nest comments");
+		/* we start a comment block by create a document fragment with 1 element root: commentRoot
+		 * Further node will be add to be children of this element root.
+		 */
+		commentBlock = doc.createDocumentFragment();
+		Node node = doc.createElement("commentRoot");
+		commentBlock.appendChild(node);
+		current.push(node);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#text(java.lang.String)
+	 */
+	public void text(String content) throws IOException {
+		text(content, false);
+	}
+	
+	public void text(String content, boolean dontEscape) throws IOException {
+		if (!dontEscape)
+			content = XMLUtil.escapeXML(content, null, false);
+		checkInElement();
+		Node node = doc.createTextNode(content);
+		getCurrentElement().appendChild(node);	
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#writeBytes(byte[])
+	 */
+	public void writeBytes(byte[] bytes) throws IOException {
+		text(new String(bytes));
+	}
+
+}
diff --git a/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLNamespace.java b/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLNamespace.java
index 85690bd..3d72e83 100644
--- a/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLNamespace.java
+++ b/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLNamespace.java
@@ -1,41 +1,41 @@
-/*******************************************************************************
- * Crown Copyright (c) 2006, 2007, Copyright (c) 2006, 2007 Jiva Medical.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *    Jiva Medical - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.uomo.xml.impl;
-
-public class XMLNamespace {
-
-	private String namespace;
-	private String abbreviation;
-	
-	public XMLNamespace(String namespace, String abbreviation) {
-		super();
-		setNamespace(namespace);
-		setAbbreviation(abbreviation);
-	}
-
-	public String getAbbreviation() {
-		return abbreviation;
-	}
-
-	public void setAbbreviation(String abbreviation) {
-		this.abbreviation = abbreviation;
-	}
-
-	public String getNamespace() {
-		return namespace;
-	}
-
-	public void setNamespace(String namespace) {
-		this.namespace = namespace;
-	}
-
-}
+/*******************************************************************************
+ * Crown Copyright (c) 2006, 2007, Copyright (c) 2006, 2007 Jiva Medical.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *    Jiva Medical - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.uomo.xml.impl;
+
+public class XMLNamespace {
+
+	private String namespace;
+	private String abbreviation;
+	
+	public XMLNamespace(String namespace, String abbreviation) {
+		super();
+		setNamespace(namespace);
+		setAbbreviation(abbreviation);
+	}
+
+	public String getAbbreviation() {
+		return abbreviation;
+	}
+
+	public void setAbbreviation(String abbreviation) {
+		this.abbreviation = abbreviation;
+	}
+
+	public String getNamespace() {
+		return namespace;
+	}
+
+	public void setNamespace(String namespace) {
+		this.namespace = namespace;
+	}
+
+}
diff --git a/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLPullWriter.java b/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLPullWriter.java
index a5f781c..5e63e2a 100644
--- a/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLPullWriter.java
+++ b/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLPullWriter.java
@@ -1,101 +1,101 @@
-/*******************************************************************************
- * Crown Copyright (c) 2006, 2007, Copyright (c) 2006, 2007 Jiva Medical.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *    Jiva Medical - initial API and implementation
- *******************************************************************************/
-package org.eclipse.uomo.xml.impl;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-
-import org.eclipse.uomo.core.UOMoException;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-public class XMLPullWriter {
-
-	private XMLWriter xml;
-	
-	public XMLPullWriter(OutputStream stream) throws UnsupportedEncodingException, IOException {
-		super();
-		xml = new XMLWriter(stream, "UTF-8");
-		xml.start();
-	}
-
-	public XMLPullWriter(XMLWriter writer) throws UnsupportedEncodingException {
-		super();
-		xml = writer;
-	}
-
-	public void write(XmlPullParser xpp, boolean rootElement, String elementName, String defaultNamespace) throws UOMoException, IOException, XmlPullParserException {
-		if (defaultNamespace != null) {
-			if (!xml.namespaceDefined(defaultNamespace))
-				xml.setDefaultNamespace(defaultNamespace);
-		} else if (rootElement) 
-			xml.setDefaultNamespace(xpp.getNamespace());
-
-		if (elementName != null)
-			xml.open(defaultNamespace, elementName);
-		
-		if (rootElement)
-			processElement(xpp);
-		else {
-			processContents(xpp);
-			if (xpp.getEventType() != XmlPullParser.END_DOCUMENT)
-				xpp.next();
-		}
-		
-		if (elementName != null)
-			xml.close();
-		xml.flush();
-	}
-	
-	private void processContents(XmlPullParser xpp) throws XmlPullParserException, UOMoException, IOException {
-		while (xpp.getEventType() != XmlPullParser.END_TAG && xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
-			if (xpp.getEventType() == XmlPullParser.START_TAG)
-				processElement(xpp);
-			else if (xpp.getEventType() == XmlPullParser.TEXT)
-				processText(xpp);
-			else
-				throw new UOMoException("unhandled event type "+Integer.toString(xpp.getEventType()));
-		}
-	}
-
-	private void processElement(XmlPullParser xpp) throws UOMoException, XmlPullParserException, IOException {
-		xml.namespace(xpp.getNamespace());
-
-		processAttributes(xpp);
-		xml.open(xpp.getNamespace(), xpp.getName());
-		xpp.next();
-		
-		processContents(xpp);
-		
-		xml.close();
-		if (xpp.getEventType() != XmlPullParser.END_DOCUMENT)
-			xpp.next();
-	}
-
-	private void processText(XmlPullParser xpp) throws UOMoException, XmlPullParserException, IOException {
-		xml.text(xpp.getText());
-		xpp.next();
-	}
-
-	private void processAttributes(XmlPullParser xpp) throws IOException {
-		for (int i = 0; i < xpp.getAttributeCount(); i++) {
-			String ns = xpp.getAttributeNamespace(i);
-			if (!"".equals(ns)) {
-				xml.namespace(ns);
-     			xml.attribute(ns, xpp.getAttributeName(i), xpp.getAttributeValue(i));
-			} else 
-     			xml.attribute(xpp.getAttributeName(i), xpp.getAttributeValue(i));
-		}
-		
-	}
-
-}
+/*******************************************************************************
+ * Crown Copyright (c) 2006, 2007, Copyright (c) 2006, 2007 Jiva Medical.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *    Jiva Medical - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.uomo.xml.impl;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+
+import org.eclipse.uomo.core.UOMoException;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+public class XMLPullWriter {
+
+	private XMLWriter xml;
+	
+	public XMLPullWriter(OutputStream stream) throws UnsupportedEncodingException, IOException {
+		super();
+		xml = new XMLWriter(stream, "UTF-8");
+		xml.start();
+	}
+
+	public XMLPullWriter(XMLWriter writer) throws UnsupportedEncodingException {
+		super();
+		xml = writer;
+	}
+
+	public void write(XmlPullParser xpp, boolean rootElement, String elementName, String defaultNamespace) throws UOMoException, IOException, XmlPullParserException {
+		if (defaultNamespace != null) {
+			if (!xml.namespaceDefined(defaultNamespace))
+				xml.setDefaultNamespace(defaultNamespace);
+		} else if (rootElement) 
+			xml.setDefaultNamespace(xpp.getNamespace());
+
+		if (elementName != null)
+			xml.open(defaultNamespace, elementName);
+		
+		if (rootElement)
+			processElement(xpp);
+		else {
+			processContents(xpp);
+			if (xpp.getEventType() != XmlPullParser.END_DOCUMENT)
+				xpp.next();
+		}
+		
+		if (elementName != null)
+			xml.close();
+		xml.flush();
+	}
+	
+	private void processContents(XmlPullParser xpp) throws XmlPullParserException, UOMoException, IOException {
+		while (xpp.getEventType() != XmlPullParser.END_TAG && xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
+			if (xpp.getEventType() == XmlPullParser.START_TAG)
+				processElement(xpp);
+			else if (xpp.getEventType() == XmlPullParser.TEXT)
+				processText(xpp);
+			else
+				throw new UOMoException("unhandled event type "+Integer.toString(xpp.getEventType()));
+		}
+	}
+
+	private void processElement(XmlPullParser xpp) throws UOMoException, XmlPullParserException, IOException {
+		xml.namespace(xpp.getNamespace());
+
+		processAttributes(xpp);
+		xml.open(xpp.getNamespace(), xpp.getName());
+		xpp.next();
+		
+		processContents(xpp);
+		
+		xml.close();
+		if (xpp.getEventType() != XmlPullParser.END_DOCUMENT)
+			xpp.next();
+	}
+
+	private void processText(XmlPullParser xpp) throws UOMoException, XmlPullParserException, IOException {
+		xml.text(xpp.getText());
+		xpp.next();
+	}
+
+	private void processAttributes(XmlPullParser xpp) throws IOException {
+		for (int i = 0; i < xpp.getAttributeCount(); i++) {
+			String ns = xpp.getAttributeNamespace(i);
+			if (!"".equals(ns)) {
+				xml.namespace(ns);
+     			xml.attribute(ns, xpp.getAttributeName(i), xpp.getAttributeValue(i));
+			} else 
+     			xml.attribute(xpp.getAttributeName(i), xpp.getAttributeValue(i));
+		}
+		
+	}
+
+}
diff --git a/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLStringsParser.java b/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLStringsParser.java
index 651a181..c794c81 100644
--- a/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLStringsParser.java
+++ b/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLStringsParser.java
@@ -1,76 +1,76 @@
-/*******************************************************************************
- * Crown Copyright (c) 2006, 2007, Copyright (c) 2006, 2007 Jiva Medical.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *    Jiva Medical - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.uomo.xml.impl;
-
-import org.eclipse.uomo.xml.XMLObjectParser;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-public class XMLStringsParser extends XMLObjectParser {
-
-	private String namespace;
-	private String name;
-	
-	private String[] content;
-	private StringBuffer current = null;
-	
-	
-	public XMLStringsParser(String namespace, String name) {
-		super();
-		this.namespace = namespace;
-		this.name = name;
-	}
-
-	public void endElement(String namespace, String name) throws SAXException {
-		if (current != null)
-			addContent(current.toString());
-			
-		current = null;
-	}
-
-	private void addContent(String string) {
-		if (content == null)
-			content = new String[] {string};
-		else {
-			String[] newContent = new String[content.length + 1];
-			for (int i = 0; i < content.length; i++)
-				newContent[i] = content[i];
-			newContent[content.length] = string;
-			content = newContent;
-		}
-	}
-
-	public XMLObjectParser startElement(String namespace, String name, String defaultNamespace, Attributes attributes) throws SAXException {
-		if (namespace.equals(this.namespace) && name.equals(this.name)) {
-			current = new StringBuffer();
-			return null;
-		}
-		else
-			return super.startElement(namespace, name, defaultNamespace, attributes);
-	}
-
-	public void findText(char[] ch, int start, int length, boolean whitespace) throws SAXException {
-		if (current == null)
-			super.findText(ch, start, length, whitespace);
-		else
-			current.append(ch, start, length); 
-	}
-
-	public String[] getContent() {
-		return content;
-	}
-
-	public boolean hasText() throws SAXException {
-		return true;
-	}
-
-}
+/*******************************************************************************
+ * Crown Copyright (c) 2006, 2007, Copyright (c) 2006, 2007 Jiva Medical.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *    Jiva Medical - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.uomo.xml.impl;
+
+import org.eclipse.uomo.xml.XMLObjectParser;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class XMLStringsParser extends XMLObjectParser {
+
+	private String namespace;
+	private String name;
+	
+	private String[] content;
+	private StringBuffer current = null;
+	
+	
+	public XMLStringsParser(String namespace, String name) {
+		super();
+		this.namespace = namespace;
+		this.name = name;
+	}
+
+	public void endElement(String namespace, String name) throws SAXException {
+		if (current != null)
+			addContent(current.toString());
+			
+		current = null;
+	}
+
+	private void addContent(String string) {
+		if (content == null)
+			content = new String[] {string};
+		else {
+			String[] newContent = new String[content.length + 1];
+			for (int i = 0; i < content.length; i++)
+				newContent[i] = content[i];
+			newContent[content.length] = string;
+			content = newContent;
+		}
+	}
+
+	public XMLObjectParser startElement(String namespace, String name, String defaultNamespace, Attributes attributes) throws SAXException {
+		if (namespace.equals(this.namespace) && name.equals(this.name)) {
+			current = new StringBuffer();
+			return null;
+		}
+		else
+			return super.startElement(namespace, name, defaultNamespace, attributes);
+	}
+
+	public void findText(char[] ch, int start, int length, boolean whitespace) throws SAXException {
+		if (current == null)
+			super.findText(ch, start, length, whitespace);
+		else
+			current.append(ch, start, length); 
+	}
+
+	public String[] getContent() {
+		return content;
+	}
+
+	public boolean hasText() throws SAXException {
+		return true;
+	}
+
+}
diff --git a/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLWriter.java b/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLWriter.java
index 7f44294..5b33c71 100644
--- a/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLWriter.java
+++ b/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLWriter.java
@@ -1,780 +1,780 @@
-/*******************************************************************************
- * Crown Copyright (c) 2006, 2007, Copyright (c) 2006, 2007 Jiva Medical.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *    Jiva Medical - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.uomo.xml.impl;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.UnsupportedEncodingException;
-
-import org.eclipse.uomo.xml.IXMLWriter;
-import org.eclipse.uomo.xml.XMLUtil;
-
-/**
- * XML Writer class.
- */
-public class XMLWriter extends OutputStreamWriter implements IXMLWriter {
-
-	private boolean xmlHeader = true;
-	private String charset;
-	private boolean prettyBase;
-	private boolean prettyHeader;
-	private boolean pendingClose;
-	private boolean pendingOpen;
-	private String pendingComment;
-	private int lineType = LINE_UNIX;
-	private OutputStream stream;
-	private boolean started = false;
-	private String[] specialAttributeNames = new String[] {"id", "name" };
-	private boolean sortAttributes;
-	private int attributeLineWrap;
-	
-	public final static int LINE_UNIX = 0;
-	public final static int LINE_WINDOWS = 1;
-
-	public XMLWriter(OutputStream stream, String charset) throws UnsupportedEncodingException {
-		super(stream, charset);
-		this.stream = stream;
-		this.charset = charset;
-	}
-
-	protected boolean condition(boolean bTest, String message) throws IOException {
-		if (!bTest)
-			throw new IOException(message);
-		return bTest;
-	}
-
-	// -- writing context ------------------------------------------------
-
-
-	
-	/**
-	 * Returns the encoding.
-	 * 
-	 * @param charset
-	 * @return encoding
-	 * @throws IOException
-	 */
-	public static String getXMLCharsetName(String charset) throws IOException {
-		if (charset == null || charset.equals(""))
-			return "UTF-8";
-		else if (charset.equals("US-ASCII"))
-			return "UTF-8";
-		else if (XMLUtil.charSetImpliesAscii(charset))
-			return "ISO-8859-1";
-		else if (charset.equals("UTF-8"))
-			return "UTF-8";
-		else if (charset.equals("UTF-16") || charset.equals("UTF-16BE") || charset.equals("UTF-16LE"))
-			return "UTF-16";
-		else 
-			throw new IOException("Unknown charset encoding "+charset);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#start()
-	 */
-	public void start() throws IOException {
-		condition(!started, "attempt to start after starting");
-		levels.clear();
-		attributes = null;
-		try {
-			if (xmlHeader) {
-				write("<?xml version=\"1.0\" encoding=\""+getXMLCharsetName(charset)+"\"?>");
-				if (prettyBase || prettyHeader)
-					write(lineType == LINE_UNIX ? "\n" : "\r\n");
-			}
-		} catch (UnsupportedEncodingException e) {
-			// TODO Auto-generated catch block
-			throw new IOException(e.getMessage());
-		}
-		started = true;
-	}
-
-	private void checkStarted () throws IOException {
-		condition(started, "not started");
-	}
-
-	private void checkInElement() throws IOException {
-		condition(levels.size() > 0, "not in an element");
-	}
-
-	// -- attributes ----------------------------------------------------
-
-	private String[][] attributes;
-	
-	private void addAttribute(String name, String value) throws IOException {
-		addAttribute(name, value, false);
-	}
-
-	private void addAttribute(String name, String value, boolean noLines) throws IOException {
-		if (!XMLUtil.isNMToken(name))
-			throw new IOException("XML name "+name+" is not valid");
-
-		newLevelIfRequired();
-		value = XMLUtil.escapeXML(value, charset, noLines);
-
-		if (attributes == null) 
-			attributes = new String[][] {{name, value}};
-		else {
-			String[][] newattr = new String[attributes.length+1][];
-			for (int i = 0; i < attributes.length; i++) {
-				condition(!attributes[i][0].equals(name), "attempt to define attribute with name "+name+" more than once");
-				newattr[i] = attributes[i];
-			}
-			attributes = newattr;
-			attributes[attributes.length-1] = new String[] {name, value};
-		}
-	}
-
-	protected String getAttribute(String name) {
-		if (attributes != null) {
-			for (int i = 0; i < attributes.length; i++) {
-				if (attributes[i][0].equals(name)) {
-					return attributes[i][1];
-				}
-			}			
-		}
-		return null;
-	}
-	
-	protected void setAttribute(String name, String value) throws IOException {
-		newLevelIfRequired();
-		if (attributes == null) 
-			addAttribute(name, value, false);
-		else {
-			for (int i = 0; i < attributes.length; i++) {
-				if (attributes[i][0].equals(name)) {
-					attributes[i][1] = XMLUtil.escapeXML(value, charset, false);
-					return;
-				}
-			}
-			addAttribute(name, value);
-		}
-	}
-
-	protected void commitAttributes() throws IOException {
-		
-	}
-
-	
-	private boolean nameIsSpecial(String name) {
-		for (int i = 0; i < specialAttributeNames.length; i++) {
-			String n = specialAttributeNames[i];
-			if (n.equalsIgnoreCase(name))
-				return true;
-		}
-		return false;
-	}
-	
-	private void writeAttributes(int col) throws IOException {
-		commitAttributes();
-		if (attributes != null && sortAttributes)
-			sortAttributes();	
-		int c = col;
-		c = writeAttributeSet(true, c, col);
-		writeAttributeSet(false, c, col);
-		attributes = null;
-	}
-
-
-	private void sortAttributes() {
-		// bubble sort - look, it's easy
-		for (int i = 0; i < attributes.length - 1; i++) {
-			for (int j = 0; j < attributes.length - 1; j++) {
-				if (String.CASE_INSENSITIVE_ORDER.compare(attributes[j][0], attributes[j+1][0]) < 0) {
-					String[] t = attributes[j];
-					attributes[j] = attributes[j+1];
-					attributes[j+1] = t;
-				}
-			}
-		}
-		
-	}
-
-
-	private int writeAttributeSet(boolean special, int col, int wrap) throws IOException {
-		// first pass: name, id
-		if (attributes != null) {
-			for (int i=0; i < attributes.length; i++) {
-				String[] element = attributes[i];
-				if (nameIsSpecial(element[0]) == special) {
-					col = col + element[0].length()+element[1].length() + 4;
-					if (isPretty() && attributeLineWrap > 0 && col > attributeLineWrap && col > wrap) {
-						write(lineType == LINE_UNIX ? "\n" : "\r\n");
-						for (int j = 0; j < wrap; j++)
-							write(" ");
-						col = wrap;
-					}
-					write(' ');
-					write(element[0]);
-					write("=\"");
-					if (element[1] != null)
-						write(element[1]);
-					write("\"");
-				}
-			}
-		}
-		return col;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attribute(java.lang.String, java.lang.String, java.lang.String, boolean)
-	 */
-	public void attribute(String namespace, String name, String value, boolean onlyIfNotEmpty) throws IOException {
-		if (!onlyIfNotEmpty || value != null && !value.equals(""))
-			attribute(namespace, name, value);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attribute(java.lang.String, java.lang.String, java.lang.String)
-	 */
-	public void attribute(String namespace, String name, String value) throws IOException {
-
-		checkStarted();
-		if (namespace == null || namespace.equals("")) 
-			addAttribute(name, value);
-		else
-			addAttribute(getNSAbbreviation(namespace)+name, value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attribute(java.lang.String, java.lang.String, boolean)
-	 */
-	public void attribute(String name, String value, boolean onlyIfNotEmpty) throws IOException {
-		if (!onlyIfNotEmpty || value != null && !value.equals(""))
-			attribute(name, value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attribute(java.lang.String, java.lang.String)
-	 */
-	public void attribute(String name, String value) throws IOException {
-		checkStarted();
-		addAttribute(name, value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attributeNoLines(java.lang.String, java.lang.String)
-	 */
-	public void attributeNoLines(String name, String value) throws IOException {
-		checkStarted();
-		addAttribute(name, value, true);
-	}
-
-	// -- levels -------------------------------------------------
-
-	private XMLWriterStateStack levels = new XMLWriterStateStack();
-
-	private void newLevelIfRequired() throws IOException {
-		if (!pendingOpen) {
-			if (!levels.empty())
-				levels.current().seeChild();
-			XMLWriterState level = new XMLWriterState();
-			level.setPretty(isPretty());
-			levels.push(level);
-			pendingOpen = true;
-		}
-	}
-
-	// -- namespaces ---------------------------------------------
-
-
-	private void defineNamespace(String namespace, String abbrev) throws IOException {
-		checkStarted();
-		if (namespace != null && !namespace.equals("")) {
-			if (abbrev.equals(""))
-				abbrev = null;
-
-			newLevelIfRequired();
-
-			levels.current().addNamespaceDefn(namespace, abbrev);
-			if (abbrev == null)
-				addAttribute("xmlns", namespace);
-			else
-				addAttribute("xmlns:"+abbrev, namespace);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#findByNamespace(java.lang.String)
-	 */
-	public XMLNamespace findByNamespace(String namespace) {
-		for (int i = levels.size() - 1; i >= 0; i--) {
-			XMLNamespace ns = levels.item(i).getDefnByNamespace(namespace);
-			if (ns != null)
-				return ns;
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#namespaceDefined(java.lang.String)
-	 */
-	public boolean namespaceDefined(String namespace) {
-		return namespace == null || namespace.equals("") || findByNamespace(namespace) != null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#findByAbbreviation(java.lang.String)
-	 */
-	public XMLNamespace findByAbbreviation(String abbreviation) {
-		for (int i = levels.size() - 1; i >= 0; i--) {
-			XMLNamespace ns = levels.item(i).getDefnByAbbreviation(abbreviation);
-			if (ns != null)
-				return ns;
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#abbreviationDefined(java.lang.String)
-	 */
-	public boolean abbreviationDefined(String abbreviation) {
-		return findByAbbreviation(abbreviation) != null;
-	}
-
-	protected XMLNamespace findDefaultNamespace() {
-		for (int i = levels.size() - 1; i >= 0; i--) {
-			XMLNamespace ns = levels.item(i).getDefaultNamespace();
-			if (ns != null)
-				return ns;
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#getDefaultNamespace()
-	 */
-	public String getDefaultNamespace() {
-		XMLNamespace ns = findDefaultNamespace();
-		if (ns == null)
-			return null;
-		else
-			return ns.getNamespace();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#namespace(java.lang.String)
-	 */
-	public void namespace(String namespace) throws IOException {
-		if (!namespaceDefined(namespace)) {
-			int index = 0;
-			while (abbreviationDefined("ns"+Integer.toString(index))) 
-				index++;
-			defineNamespace(namespace, "ns"+Integer.toString(index));
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#defaultNamespace(java.lang.String)
-	 * 
-	 * Replace defaultNamespace()
-	 */
-	public void setDefaultNamespace(String namespace) throws IOException {
-		if ((namespace == null && getDefaultNamespace() != null) ||
-				(namespace != null && !namespace.equals(getDefaultNamespace())))
-			defineNamespace(namespace, "");			
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#namespace(java.lang.String, java.lang.String)
-	 */
-	public void namespace(String namespace, String abbreviation) throws IOException {
-		XMLNamespace ns = findByAbbreviation(abbreviation);
-		if (ns == null || !ns.getNamespace().equals(namespace))
-			defineNamespace(namespace, abbreviation);
-	}
-
-
-	private String getNSAbbreviation(String namespace) throws IOException {
-		if ("http://www.w3.org/XML/1998/namespace".equals(namespace))
-			return "xml:";
-		
-		if (namespace == null || "".equals(namespace))
-			return "";
-		
-		XMLNamespace ns = findByNamespace(namespace);
-		if (ns == null)
-			throw new IOException("Namespace "+namespace+" is not defined");
-		else if (ns.getAbbreviation() == null)
-			return "";
-		else
-			return ns.getAbbreviation()+":";
-	}
-
-	// -- public API -----------------------------------------------------------
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#comment(java.lang.String, boolean)
-	 */
-	public void comment(String comment, boolean doPretty) throws IOException {
-		checkStarted();
-		if (pendingClose) { 
-			write('>');
-			writePendingComment();
-			pendingClose = false;
-		}
-		if (doPretty) {
-			writePretty();
-			if (isPretty()) {
-				for (int i = 0; i < levels.size(); i++)
-					write("  ");
-			}
-		}
-		if (levels.inComment())
-			write("<!-- "+comment+" -- >");
-		else
-			write("<!-- "+comment+" -->");
-		if (doPretty && !isPretty())
-			writePretty();
-	}
-
-
-	private void writePendingComment() throws IOException {
-		if (pendingComment != null) {
-			if (isPretty())
-				write("   ");
-			if (levels.inComment())
-				write("<!-- "+pendingComment+" -- >");
-			else
-				write("<!-- "+pendingComment+" -->");
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#open(java.lang.String, java.lang.String)
-	 */
-	public void open(String namespace, String name) throws IOException {
-		open(namespace, name, null);
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#open(java.lang.String, java.lang.String, java.lang.String)
-	 */
-	public void open(String namespace, String name, String comment) throws IOException {
-		if (!XMLUtil.isNMToken(name))
-			throw new IOException("XML name "+name+" is not valid");
-		checkStarted();
-		if (pendingClose) { 
-			write('>');
-			writePendingComment();
-			pendingClose = false;
-		}
-
-		if (name == null) {
-			throw new IOException("name is null");
-		}
-		newLevelIfRequired();
-		levels.current().setName(name);
-		levels.current().setNamespace(namespace);
-		int col = writePretty();
-		write('<');
-		if (namespace == null) {
-			write(name);
-			col = col + name.length()+1;
-		} else {
-			String n = getNSAbbreviation(namespace)+name;
-			write(n);
-			col = col + n.length()+1;
-		}
-		writeAttributes(col);
-		pendingOpen = false;
-		pendingClose = true;
-		pendingComment = comment;
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#close(java.lang.String)
-	 */
-	public void close(String name) throws IOException {
-		checkStarted();
-		if (levels.empty())
-			throw new IOException("Unable to close null|"+name+", nothing to close");
-		if (levels.current().getNamespace() != null || !levels.current().getName().equals(name))
-			throw new IOException("Unable to close null|"+name+", found "+levels.current().getNamespace()+"|"+levels.current().getName());
-		close();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#close(java.lang.String, java.lang.String)
-	 */
-	public void close(String namespace, String name) throws IOException {
-		checkStarted();
-		if (levels.empty())
-			throw new IOException("Unable to close "+namespace+"|"+name+", nothing to close");
-		if (!levels.current().getNamespace().equals(namespace) || !levels.current().getName().equals(name))
-			throw new IOException("Unable to close "+namespace+"|"+name+", found "+levels.current().getNamespace()+"|"+levels.current().getName());
-		close();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#closeToLevel(int)
-	 */
-	public void closeToLevel(int count) throws IOException {
-		while (levels.size() > count)
-			close();		
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#close()
-	 */
-	public void close() throws IOException {
-		checkStarted();
-		if (levels.empty()) {
-			super.close();
-		} else {
-			if (pendingClose) { 
-				write("/>");
-				writePendingComment();
-				pendingClose = false;
-			} else {
-				if (levels.current().hasChildren())
-					writePretty();
-				write("</");
-				if (levels.current().getNamespace() == null)
-					write(levels.current().getName());
-				else
-					write(getNSAbbreviation(levels.current().getNamespace())+levels.current().getName());
-				write('>');
-			}
-			levels.pop();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#open(java.lang.String)
-	 */
-	public void open(String name) throws IOException {
-		open(null, name);
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String, java.lang.String, boolean)
-	 */
-	public void element(String namespace, String name, String content, boolean onlyIfNotEmpty) throws IOException {
-		if (!onlyIfNotEmpty || content != null && !content.equals(""))
-			element(namespace, name, content);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
-	 */
-	public void element(String namespace, String name, String content, String comment) throws IOException {
-		if (!XMLUtil.isNMToken(name))
-			throw new IOException("XML name "+name+" is not valid");
-		open(namespace, name, comment);
-		text(content);
-		close();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String, java.lang.String)
-	 */
-	public void element(String namespace, String name, String content) throws IOException {
-		if (!XMLUtil.isNMToken(name))
-			throw new IOException("XML name "+name+" is not valid");
-		open(namespace, name);
-		text(content);
-		close();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String, boolean)
-	 */
-	public void element(String name, String content, boolean onlyIfNotEmpty) throws IOException {
-		if (!onlyIfNotEmpty || content != null && !content.equals(""))
-			element(null, name, content);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String)
-	 */
-	public void element(String name, String content) throws IOException {
-		element(null, name, content);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#text(java.lang.String)
-	 */
-	public void text(String content) throws IOException {
-		text(content, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#text(java.lang.String, boolean)
-	 * 
-	 * Replace escapeText()
-	 */
-	public void text(String content, boolean dontEscape) throws IOException {
-		checkInElement();
-		if (content != null) {
-			if (pendingClose) { 
-				write(">");
-				writePendingComment();
-				pendingClose = false;
-			}
-			if (dontEscape)
-				write(content);
-			else
-				write(XMLUtil.escapeXML(content, charset, false));
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#cData(java.lang.String)
-	 */
-	public void cData(String text) throws IOException {
-		text("<![CDATA["+text+"]]>");		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#writeBytes(byte[])
-	 */
-	public void writeBytes(byte[] bytes) throws IOException {
-		checkInElement();
-		if (pendingClose) { 
-			write(">");
-			writePendingComment();
-			pendingClose = false;
-		}
-		flush();
-		stream.write(bytes);
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#isPretty()
-	 */
-	public boolean isPretty() throws IOException {
-		return (levels == null || levels.empty()) ? prettyBase : levels.current().isPretty();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#setPretty(boolean)
-	 */
-	public void setPretty(boolean pretty) throws IOException {
-		if (levels == null || levels.empty())
-			this.prettyBase = pretty;
-		else 
-			levels.current().setPretty(pretty);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#startCommentBlock()
-	 */
-	public void startCommentBlock() throws IOException {
-		if (levels.inComment())
-			throw new IOException("cannot nest comments");
-		levels.current().setInComment(true);
-		if (isPretty())
-			writePretty();
-		write("<!--");
-		if (isPretty())
-			writePretty();		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#endCommentBlock()
-	 */
-	public void endCommentBlock() throws IOException {
-		if (!levels.inComment())
-			throw new IOException("cannot close a comment block when it is open");
-		if (!levels.current().isInComment())
-			throw new IOException("cannot close a comment block when it is open");
-		if (isPretty())
-			writePretty();
-		write("-->");
-		if (isPretty())
-			writePretty();		
-		levels.current().setInComment(false);
-	}
-
-	public boolean isSortAttributes() {
-		return sortAttributes;
-	}
-
-	public void setSortAttributes(boolean sortAttributes) {
-		this.sortAttributes = sortAttributes;
-	}
-
-
-	public boolean isPrettyHeader() {
-		return prettyHeader;
-	}
-
-	public void setPrettyHeader(boolean pretty) {
-		this.prettyHeader = pretty;
-	}
-
-	public int writePretty() throws IOException {
-		return writePretty(true);
-	}
-	
-	public int writePretty(boolean eoln) throws IOException {
-		if (isPretty()) {
-			if (eoln)
-				write(lineType == LINE_UNIX ? "\n" : "\r\n");
-			for (int i = 0; i < levels.size() - 1; i++)
-				write("  ");
-			return (levels.size() - 1) * 2;
-		} else
-			return 0;
-	}
-
-	public int getLineType() {
-		return lineType;
-	}
-
-	public void setLineType(int lineType) {
-		this.lineType = lineType;
-	}
-
-	public boolean isXmlHeader() {
-		return xmlHeader;
-	}
-
-	public void setXmlHeader(boolean xmlHeader) {
-		this.xmlHeader = xmlHeader;
-	}
-
-	public String[] getSpecialAttributeNames() {
-		return specialAttributeNames;
-	}
-
-	public void setSpecialAttributeNames(String[] specialAttributeNames) {
-		this.specialAttributeNames = specialAttributeNames;
-	}
-
-	public int getAttributeLineWrap() {
-		return attributeLineWrap;
-	}
-
-	public void setAttributeLineWrap(int attributeLineWrap) {
-		this.attributeLineWrap = attributeLineWrap;
-	}
-
-	public void escapedText(String content) throws IOException {
-		text("");
-		int i = content.length();
-		if (isPretty())
-		  while (i > 0 && (content.charAt(i-1) == '\r' || content.charAt(i-1) == '\n'))
-			 i--;
-		write(content.substring(0, i));
-	}
-	
-	
-}
-
+/*******************************************************************************
+ * Crown Copyright (c) 2006, 2007, Copyright (c) 2006, 2007 Jiva Medical.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *    Jiva Medical - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.uomo.xml.impl;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+
+import org.eclipse.uomo.xml.IXMLWriter;
+import org.eclipse.uomo.xml.XMLUtil;
+
+/**
+ * XML Writer class.
+ */
+public class XMLWriter extends OutputStreamWriter implements IXMLWriter {
+
+	private boolean xmlHeader = true;
+	private String charset;
+	private boolean prettyBase;
+	private boolean prettyHeader;
+	private boolean pendingClose;
+	private boolean pendingOpen;
+	private String pendingComment;
+	private int lineType = LINE_UNIX;
+	private OutputStream stream;
+	private boolean started = false;
+	private String[] specialAttributeNames = new String[] {"id", "name" };
+	private boolean sortAttributes;
+	private int attributeLineWrap;
+	
+	public final static int LINE_UNIX = 0;
+	public final static int LINE_WINDOWS = 1;
+
+	public XMLWriter(OutputStream stream, String charset) throws UnsupportedEncodingException {
+		super(stream, charset);
+		this.stream = stream;
+		this.charset = charset;
+	}
+
+	protected boolean condition(boolean bTest, String message) throws IOException {
+		if (!bTest)
+			throw new IOException(message);
+		return bTest;
+	}
+
+	// -- writing context ------------------------------------------------
+
+
+	
+	/**
+	 * Returns the encoding.
+	 * 
+	 * @param charset
+	 * @return encoding
+	 * @throws IOException
+	 */
+	public static String getXMLCharsetName(String charset) throws IOException {
+		if (charset == null || charset.equals(""))
+			return "UTF-8";
+		else if (charset.equals("US-ASCII"))
+			return "UTF-8";
+		else if (XMLUtil.charSetImpliesAscii(charset))
+			return "ISO-8859-1";
+		else if (charset.equals("UTF-8"))
+			return "UTF-8";
+		else if (charset.equals("UTF-16") || charset.equals("UTF-16BE") || charset.equals("UTF-16LE"))
+			return "UTF-16";
+		else 
+			throw new IOException("Unknown charset encoding "+charset);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#start()
+	 */
+	public void start() throws IOException {
+		condition(!started, "attempt to start after starting");
+		levels.clear();
+		attributes = null;
+		try {
+			if (xmlHeader) {
+				write("<?xml version=\"1.0\" encoding=\""+getXMLCharsetName(charset)+"\"?>");
+				if (prettyBase || prettyHeader)
+					write(lineType == LINE_UNIX ? "\n" : "\r\n");
+			}
+		} catch (UnsupportedEncodingException e) {
+			// TODO Auto-generated catch block
+			throw new IOException(e.getMessage());
+		}
+		started = true;
+	}
+
+	private void checkStarted () throws IOException {
+		condition(started, "not started");
+	}
+
+	private void checkInElement() throws IOException {
+		condition(levels.size() > 0, "not in an element");
+	}
+
+	// -- attributes ----------------------------------------------------
+
+	private String[][] attributes;
+	
+	private void addAttribute(String name, String value) throws IOException {
+		addAttribute(name, value, false);
+	}
+
+	private void addAttribute(String name, String value, boolean noLines) throws IOException {
+		if (!XMLUtil.isNMToken(name))
+			throw new IOException("XML name "+name+" is not valid");
+
+		newLevelIfRequired();
+		value = XMLUtil.escapeXML(value, charset, noLines);
+
+		if (attributes == null) 
+			attributes = new String[][] {{name, value}};
+		else {
+			String[][] newattr = new String[attributes.length+1][];
+			for (int i = 0; i < attributes.length; i++) {
+				condition(!attributes[i][0].equals(name), "attempt to define attribute with name "+name+" more than once");
+				newattr[i] = attributes[i];
+			}
+			attributes = newattr;
+			attributes[attributes.length-1] = new String[] {name, value};
+		}
+	}
+
+	protected String getAttribute(String name) {
+		if (attributes != null) {
+			for (int i = 0; i < attributes.length; i++) {
+				if (attributes[i][0].equals(name)) {
+					return attributes[i][1];
+				}
+			}			
+		}
+		return null;
+	}
+	
+	protected void setAttribute(String name, String value) throws IOException {
+		newLevelIfRequired();
+		if (attributes == null) 
+			addAttribute(name, value, false);
+		else {
+			for (int i = 0; i < attributes.length; i++) {
+				if (attributes[i][0].equals(name)) {
+					attributes[i][1] = XMLUtil.escapeXML(value, charset, false);
+					return;
+				}
+			}
+			addAttribute(name, value);
+		}
+	}
+
+	protected void commitAttributes() throws IOException {
+		
+	}
+
+	
+	private boolean nameIsSpecial(String name) {
+		for (int i = 0; i < specialAttributeNames.length; i++) {
+			String n = specialAttributeNames[i];
+			if (n.equalsIgnoreCase(name))
+				return true;
+		}
+		return false;
+	}
+	
+	private void writeAttributes(int col) throws IOException {
+		commitAttributes();
+		if (attributes != null && sortAttributes)
+			sortAttributes();	
+		int c = col;
+		c = writeAttributeSet(true, c, col);
+		writeAttributeSet(false, c, col);
+		attributes = null;
+	}
+
+
+	private void sortAttributes() {
+		// bubble sort - look, it's easy
+		for (int i = 0; i < attributes.length - 1; i++) {
+			for (int j = 0; j < attributes.length - 1; j++) {
+				if (String.CASE_INSENSITIVE_ORDER.compare(attributes[j][0], attributes[j+1][0]) < 0) {
+					String[] t = attributes[j];
+					attributes[j] = attributes[j+1];
+					attributes[j+1] = t;
+				}
+			}
+		}
+		
+	}
+
+
+	private int writeAttributeSet(boolean special, int col, int wrap) throws IOException {
+		// first pass: name, id
+		if (attributes != null) {
+			for (int i=0; i < attributes.length; i++) {
+				String[] element = attributes[i];
+				if (nameIsSpecial(element[0]) == special) {
+					col = col + element[0].length()+element[1].length() + 4;
+					if (isPretty() && attributeLineWrap > 0 && col > attributeLineWrap && col > wrap) {
+						write(lineType == LINE_UNIX ? "\n" : "\r\n");
+						for (int j = 0; j < wrap; j++)
+							write(" ");
+						col = wrap;
+					}
+					write(' ');
+					write(element[0]);
+					write("=\"");
+					if (element[1] != null)
+						write(element[1]);
+					write("\"");
+				}
+			}
+		}
+		return col;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attribute(java.lang.String, java.lang.String, java.lang.String, boolean)
+	 */
+	public void attribute(String namespace, String name, String value, boolean onlyIfNotEmpty) throws IOException {
+		if (!onlyIfNotEmpty || value != null && !value.equals(""))
+			attribute(namespace, name, value);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attribute(java.lang.String, java.lang.String, java.lang.String)
+	 */
+	public void attribute(String namespace, String name, String value) throws IOException {
+
+		checkStarted();
+		if (namespace == null || namespace.equals("")) 
+			addAttribute(name, value);
+		else
+			addAttribute(getNSAbbreviation(namespace)+name, value);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attribute(java.lang.String, java.lang.String, boolean)
+	 */
+	public void attribute(String name, String value, boolean onlyIfNotEmpty) throws IOException {
+		if (!onlyIfNotEmpty || value != null && !value.equals(""))
+			attribute(name, value);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attribute(java.lang.String, java.lang.String)
+	 */
+	public void attribute(String name, String value) throws IOException {
+		checkStarted();
+		addAttribute(name, value);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#attributeNoLines(java.lang.String, java.lang.String)
+	 */
+	public void attributeNoLines(String name, String value) throws IOException {
+		checkStarted();
+		addAttribute(name, value, true);
+	}
+
+	// -- levels -------------------------------------------------
+
+	private XMLWriterStateStack levels = new XMLWriterStateStack();
+
+	private void newLevelIfRequired() throws IOException {
+		if (!pendingOpen) {
+			if (!levels.empty())
+				levels.current().seeChild();
+			XMLWriterState level = new XMLWriterState();
+			level.setPretty(isPretty());
+			levels.push(level);
+			pendingOpen = true;
+		}
+	}
+
+	// -- namespaces ---------------------------------------------
+
+
+	private void defineNamespace(String namespace, String abbrev) throws IOException {
+		checkStarted();
+		if (namespace != null && !namespace.equals("")) {
+			if (abbrev.equals(""))
+				abbrev = null;
+
+			newLevelIfRequired();
+
+			levels.current().addNamespaceDefn(namespace, abbrev);
+			if (abbrev == null)
+				addAttribute("xmlns", namespace);
+			else
+				addAttribute("xmlns:"+abbrev, namespace);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#findByNamespace(java.lang.String)
+	 */
+	public XMLNamespace findByNamespace(String namespace) {
+		for (int i = levels.size() - 1; i >= 0; i--) {
+			XMLNamespace ns = levels.item(i).getDefnByNamespace(namespace);
+			if (ns != null)
+				return ns;
+		}
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#namespaceDefined(java.lang.String)
+	 */
+	public boolean namespaceDefined(String namespace) {
+		return namespace == null || namespace.equals("") || findByNamespace(namespace) != null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#findByAbbreviation(java.lang.String)
+	 */
+	public XMLNamespace findByAbbreviation(String abbreviation) {
+		for (int i = levels.size() - 1; i >= 0; i--) {
+			XMLNamespace ns = levels.item(i).getDefnByAbbreviation(abbreviation);
+			if (ns != null)
+				return ns;
+		}
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#abbreviationDefined(java.lang.String)
+	 */
+	public boolean abbreviationDefined(String abbreviation) {
+		return findByAbbreviation(abbreviation) != null;
+	}
+
+	protected XMLNamespace findDefaultNamespace() {
+		for (int i = levels.size() - 1; i >= 0; i--) {
+			XMLNamespace ns = levels.item(i).getDefaultNamespace();
+			if (ns != null)
+				return ns;
+		}
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#getDefaultNamespace()
+	 */
+	public String getDefaultNamespace() {
+		XMLNamespace ns = findDefaultNamespace();
+		if (ns == null)
+			return null;
+		else
+			return ns.getNamespace();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#namespace(java.lang.String)
+	 */
+	public void namespace(String namespace) throws IOException {
+		if (!namespaceDefined(namespace)) {
+			int index = 0;
+			while (abbreviationDefined("ns"+Integer.toString(index))) 
+				index++;
+			defineNamespace(namespace, "ns"+Integer.toString(index));
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#defaultNamespace(java.lang.String)
+	 * 
+	 * Replace defaultNamespace()
+	 */
+	public void setDefaultNamespace(String namespace) throws IOException {
+		if ((namespace == null && getDefaultNamespace() != null) ||
+				(namespace != null && !namespace.equals(getDefaultNamespace())))
+			defineNamespace(namespace, "");			
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#namespace(java.lang.String, java.lang.String)
+	 */
+	public void namespace(String namespace, String abbreviation) throws IOException {
+		XMLNamespace ns = findByAbbreviation(abbreviation);
+		if (ns == null || !ns.getNamespace().equals(namespace))
+			defineNamespace(namespace, abbreviation);
+	}
+
+
+	private String getNSAbbreviation(String namespace) throws IOException {
+		if ("http://www.w3.org/XML/1998/namespace".equals(namespace))
+			return "xml:";
+		
+		if (namespace == null || "".equals(namespace))
+			return "";
+		
+		XMLNamespace ns = findByNamespace(namespace);
+		if (ns == null)
+			throw new IOException("Namespace "+namespace+" is not defined");
+		else if (ns.getAbbreviation() == null)
+			return "";
+		else
+			return ns.getAbbreviation()+":";
+	}
+
+	// -- public API -----------------------------------------------------------
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#comment(java.lang.String, boolean)
+	 */
+	public void comment(String comment, boolean doPretty) throws IOException {
+		checkStarted();
+		if (pendingClose) { 
+			write('>');
+			writePendingComment();
+			pendingClose = false;
+		}
+		if (doPretty) {
+			writePretty();
+			if (isPretty()) {
+				for (int i = 0; i < levels.size(); i++)
+					write("  ");
+			}
+		}
+		if (levels.inComment())
+			write("<!-- "+comment+" -- >");
+		else
+			write("<!-- "+comment+" -->");
+		if (doPretty && !isPretty())
+			writePretty();
+	}
+
+
+	private void writePendingComment() throws IOException {
+		if (pendingComment != null) {
+			if (isPretty())
+				write("   ");
+			if (levels.inComment())
+				write("<!-- "+pendingComment+" -- >");
+			else
+				write("<!-- "+pendingComment+" -->");
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#open(java.lang.String, java.lang.String)
+	 */
+	public void open(String namespace, String name) throws IOException {
+		open(namespace, name, null);
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#open(java.lang.String, java.lang.String, java.lang.String)
+	 */
+	public void open(String namespace, String name, String comment) throws IOException {
+		if (!XMLUtil.isNMToken(name))
+			throw new IOException("XML name "+name+" is not valid");
+		checkStarted();
+		if (pendingClose) { 
+			write('>');
+			writePendingComment();
+			pendingClose = false;
+		}
+
+		if (name == null) {
+			throw new IOException("name is null");
+		}
+		newLevelIfRequired();
+		levels.current().setName(name);
+		levels.current().setNamespace(namespace);
+		int col = writePretty();
+		write('<');
+		if (namespace == null) {
+			write(name);
+			col = col + name.length()+1;
+		} else {
+			String n = getNSAbbreviation(namespace)+name;
+			write(n);
+			col = col + n.length()+1;
+		}
+		writeAttributes(col);
+		pendingOpen = false;
+		pendingClose = true;
+		pendingComment = comment;
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#close(java.lang.String)
+	 */
+	public void close(String name) throws IOException {
+		checkStarted();
+		if (levels.empty())
+			throw new IOException("Unable to close null|"+name+", nothing to close");
+		if (levels.current().getNamespace() != null || !levels.current().getName().equals(name))
+			throw new IOException("Unable to close null|"+name+", found "+levels.current().getNamespace()+"|"+levels.current().getName());
+		close();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#close(java.lang.String, java.lang.String)
+	 */
+	public void close(String namespace, String name) throws IOException {
+		checkStarted();
+		if (levels.empty())
+			throw new IOException("Unable to close "+namespace+"|"+name+", nothing to close");
+		if (!levels.current().getNamespace().equals(namespace) || !levels.current().getName().equals(name))
+			throw new IOException("Unable to close "+namespace+"|"+name+", found "+levels.current().getNamespace()+"|"+levels.current().getName());
+		close();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#closeToLevel(int)
+	 */
+	public void closeToLevel(int count) throws IOException {
+		while (levels.size() > count)
+			close();		
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#close()
+	 */
+	public void close() throws IOException {
+		checkStarted();
+		if (levels.empty()) {
+			super.close();
+		} else {
+			if (pendingClose) { 
+				write("/>");
+				writePendingComment();
+				pendingClose = false;
+			} else {
+				if (levels.current().hasChildren())
+					writePretty();
+				write("</");
+				if (levels.current().getNamespace() == null)
+					write(levels.current().getName());
+				else
+					write(getNSAbbreviation(levels.current().getNamespace())+levels.current().getName());
+				write('>');
+			}
+			levels.pop();
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#open(java.lang.String)
+	 */
+	public void open(String name) throws IOException {
+		open(null, name);
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String, java.lang.String, boolean)
+	 */
+	public void element(String namespace, String name, String content, boolean onlyIfNotEmpty) throws IOException {
+		if (!onlyIfNotEmpty || content != null && !content.equals(""))
+			element(namespace, name, content);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
+	 */
+	public void element(String namespace, String name, String content, String comment) throws IOException {
+		if (!XMLUtil.isNMToken(name))
+			throw new IOException("XML name "+name+" is not valid");
+		open(namespace, name, comment);
+		text(content);
+		close();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String, java.lang.String)
+	 */
+	public void element(String namespace, String name, String content) throws IOException {
+		if (!XMLUtil.isNMToken(name))
+			throw new IOException("XML name "+name+" is not valid");
+		open(namespace, name);
+		text(content);
+		close();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String, boolean)
+	 */
+	public void element(String name, String content, boolean onlyIfNotEmpty) throws IOException {
+		if (!onlyIfNotEmpty || content != null && !content.equals(""))
+			element(null, name, content);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#element(java.lang.String, java.lang.String)
+	 */
+	public void element(String name, String content) throws IOException {
+		element(null, name, content);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#text(java.lang.String)
+	 */
+	public void text(String content) throws IOException {
+		text(content, false);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#text(java.lang.String, boolean)
+	 * 
+	 * Replace escapeText()
+	 */
+	public void text(String content, boolean dontEscape) throws IOException {
+		checkInElement();
+		if (content != null) {
+			if (pendingClose) { 
+				write(">");
+				writePendingComment();
+				pendingClose = false;
+			}
+			if (dontEscape)
+				write(content);
+			else
+				write(XMLUtil.escapeXML(content, charset, false));
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#cData(java.lang.String)
+	 */
+	public void cData(String text) throws IOException {
+		text("<![CDATA["+text+"]]>");		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#writeBytes(byte[])
+	 */
+	public void writeBytes(byte[] bytes) throws IOException {
+		checkInElement();
+		if (pendingClose) { 
+			write(">");
+			writePendingComment();
+			pendingClose = false;
+		}
+		flush();
+		stream.write(bytes);
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#isPretty()
+	 */
+	public boolean isPretty() throws IOException {
+		return (levels == null || levels.empty()) ? prettyBase : levels.current().isPretty();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#setPretty(boolean)
+	 */
+	public void setPretty(boolean pretty) throws IOException {
+		if (levels == null || levels.empty())
+			this.prettyBase = pretty;
+		else 
+			levels.current().setPretty(pretty);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#startCommentBlock()
+	 */
+	public void startCommentBlock() throws IOException {
+		if (levels.inComment())
+			throw new IOException("cannot nest comments");
+		levels.current().setInComment(true);
+		if (isPretty())
+			writePretty();
+		write("<!--");
+		if (isPretty())
+			writePretty();		
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ohf.utilities.xml.IXMLWriter#endCommentBlock()
+	 */
+	public void endCommentBlock() throws IOException {
+		if (!levels.inComment())
+			throw new IOException("cannot close a comment block when it is open");
+		if (!levels.current().isInComment())
+			throw new IOException("cannot close a comment block when it is open");
+		if (isPretty())
+			writePretty();
+		write("-->");
+		if (isPretty())
+			writePretty();		
+		levels.current().setInComment(false);
+	}
+
+	public boolean isSortAttributes() {
+		return sortAttributes;
+	}
+
+	public void setSortAttributes(boolean sortAttributes) {
+		this.sortAttributes = sortAttributes;
+	}
+
+
+	public boolean isPrettyHeader() {
+		return prettyHeader;
+	}
+
+	public void setPrettyHeader(boolean pretty) {
+		this.prettyHeader = pretty;
+	}
+
+	public int writePretty() throws IOException {
+		return writePretty(true);
+	}
+	
+	public int writePretty(boolean eoln) throws IOException {
+		if (isPretty()) {
+			if (eoln)
+				write(lineType == LINE_UNIX ? "\n" : "\r\n");
+			for (int i = 0; i < levels.size() - 1; i++)
+				write("  ");
+			return (levels.size() - 1) * 2;
+		} else
+			return 0;
+	}
+
+	public int getLineType() {
+		return lineType;
+	}
+
+	public void setLineType(int lineType) {
+		this.lineType = lineType;
+	}
+
+	public boolean isXmlHeader() {
+		return xmlHeader;
+	}
+
+	public void setXmlHeader(boolean xmlHeader) {
+		this.xmlHeader = xmlHeader;
+	}
+
+	public String[] getSpecialAttributeNames() {
+		return specialAttributeNames;
+	}
+
+	public void setSpecialAttributeNames(String[] specialAttributeNames) {
+		this.specialAttributeNames = specialAttributeNames;
+	}
+
+	public int getAttributeLineWrap() {
+		return attributeLineWrap;
+	}
+
+	public void setAttributeLineWrap(int attributeLineWrap) {
+		this.attributeLineWrap = attributeLineWrap;
+	}
+
+	public void escapedText(String content) throws IOException {
+		text("");
+		int i = content.length();
+		if (isPretty())
+		  while (i > 0 && (content.charAt(i-1) == '\r' || content.charAt(i-1) == '\n'))
+			 i--;
+		write(content.substring(0, i));
+	}
+	
+	
+}
+
diff --git a/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLWriterStateStack.java b/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLWriterStateStack.java
index c3c90f1..cd49566 100644
--- a/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLWriterStateStack.java
+++ b/bundles/org.eclipse.uomo.xml/src/main/java/org/eclipse/uomo/xml/impl/XMLWriterStateStack.java
@@ -1,67 +1,67 @@
-/*******************************************************************************
- * Crown Copyright (c) 2006, 2007, Copyright (c) 2006, 2007 Jiva Medical.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *    Jiva Medical - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.uomo.xml.impl;
-
-import java.io.IOException;
-import java.util.Vector;
-
-
-class XMLWriterStateStack {
-
-	private Vector<XMLWriterState> items = new Vector<XMLWriterState>();
-
-	public int size(){
-		return items.size();
-	}
-	
-	public boolean empty(){
-		return items.size() == 0;
-	}
-	
-	public XMLWriterState current() throws IOException {
-		if (empty())
-			throw new IOException("stack is empty trying to get current");
-		return (XMLWriterState)items.get(items.size() - 1);
-	}
-	
-	
-	public void push(XMLWriterState element) {
-		items.add(element);		
-	}
-		
-	public void clear () {
-		if (items != null)
-		  items.clear();
-	}
-
-	public void pop() throws IOException {
-		if (empty())
-			throw new IOException("stack is empty trying to pop");
-		if (current().isInComment())
-			throw new IOException("Must close a comment sequence in the element in which it was started");
-		
-		items.remove(items.size() - 1);		
-	}
-
-	public XMLWriterState item(int index) {
-		return (XMLWriterState)items.get(index);
-	}
-
-	public boolean inComment() {
-		for (int i = 0; i < items.size(); i++) {
-			if (((XMLWriterState)items.get(i)).isInComment())
-				return true;					
-		}
-		return false;
-	}
-
-}
+/*******************************************************************************
+ * Crown Copyright (c) 2006, 2007, Copyright (c) 2006, 2007 Jiva Medical.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *    Jiva Medical - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.uomo.xml.impl;
+
+import java.io.IOException;
+import java.util.Vector;
+
+
+class XMLWriterStateStack {
+
+	private Vector<XMLWriterState> items = new Vector<XMLWriterState>();
+
+	public int size(){
+		return items.size();
+	}
+	
+	public boolean empty(){
+		return items.size() == 0;
+	}
+	
+	public XMLWriterState current() throws IOException {
+		if (empty())
+			throw new IOException("stack is empty trying to get current");
+		return (XMLWriterState)items.get(items.size() - 1);
+	}
+	
+	
+	public void push(XMLWriterState element) {
+		items.add(element);		
+	}
+		
+	public void clear () {
+		if (items != null)
+		  items.clear();
+	}
+
+	public void pop() throws IOException {
+		if (empty())
+			throw new IOException("stack is empty trying to pop");
+		if (current().isInComment())
+			throw new IOException("Must close a comment sequence in the element in which it was started");
+		
+		items.remove(items.size() - 1);		
+	}
+
+	public XMLWriterState item(int index) {
+		return (XMLWriterState)items.get(index);
+	}
+
+	public boolean inComment() {
+		for (int i = 0; i < items.size(); i++) {
+			if (((XMLWriterState)items.get(i)).isInComment())
+				return true;					
+		}
+		return false;
+	}
+
+}
diff --git a/bundles/pom.xml b/bundles/pom.xml
index 9b57053..db800e0 100644
--- a/bundles/pom.xml
+++ b/bundles/pom.xml
@@ -1,28 +1,28 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<artifactId>org.eclipse.uomo</artifactId>
-		<groupId>org.eclipse.uomo</groupId>
-		<version>0.7.0-SNAPSHOT</version>
-	</parent>
-  <artifactId>org.eclipse.uomo.bundles</artifactId>
-  <name>Eclipse UOMo Bundles</name>
-  <packaging>pom</packaging>
-  <modules>
-  	<module>org.eclipse.uomo.core</module>
-  	<module>org.eclipse.uomo.core.tests</module>
-  	<module>org.eclipse.uomo.units</module>
-  	<module>org.eclipse.uomo.units.tests</module>
-  	<module>org.eclipse.uomo.xml</module>
-  	<module>org.eclipse.uomo.xml.tests</module>
-  	<module>org.eclipse.uomo.util</module>
-  	<module>org.eclipse.uomo.util.tests</module>
-  	<module>org.eclipse.uomo.ucum</module>
-  	<module>org.eclipse.uomo.ucum.tests</module>
-  	<module>org.eclipse.uomo.business</module>
-  	<module>org.eclipse.uomo.ui</module>
-  	<!-- <module>org.eclipse.uomo.business.tests</module>-->
-  </modules>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<artifactId>org.eclipse.uomo</artifactId>
+		<groupId>org.eclipse.uomo</groupId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+  <artifactId>org.eclipse.uomo.bundles</artifactId>
+  <name>Eclipse UOMo Bundles</name>
+  <packaging>pom</packaging>
+  <modules>
+  	<module>org.eclipse.uomo.core</module>
+  	<module>org.eclipse.uomo.core.tests</module>
+  	<module>org.eclipse.uomo.units</module>
+  	<module>org.eclipse.uomo.units.tests</module>
+  	<module>org.eclipse.uomo.xml</module>
+  	<module>org.eclipse.uomo.xml.tests</module>
+  	<module>org.eclipse.uomo.util</module>
+  	<module>org.eclipse.uomo.util.tests</module>
+  	<module>org.eclipse.uomo.ucum</module>
+  	<module>org.eclipse.uomo.ucum.tests</module>
+  	<module>org.eclipse.uomo.business</module>
+  	<module>org.eclipse.uomo.ui</module>
+  	<!-- <module>org.eclipse.uomo.business.tests</module>-->
+  </modules>
 </project>
\ No newline at end of file
diff --git a/examples/.gitignore b/examples/.gitignore
index 834befa..95cea85 100644
--- a/examples/.gitignore
+++ b/examples/.gitignore
@@ -1,3 +1,3 @@
-/src
-/.settings
-/target
+/src
+/.settings
+/target
diff --git a/examples/business/.project b/examples/business/.project
index 152554a..0b0abb8 100644
--- a/examples/business/.project
+++ b/examples/business/.project
@@ -1,17 +1,17 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.uomo.examples.business</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.uomo.examples.business</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/business/org.eclipse.uomo.examples.business.console/.classpath b/examples/business/org.eclipse.uomo.examples.business.console/.classpath
index 6a6c8e3..63cc387 100644
--- a/examples/business/org.eclipse.uomo.examples.business.console/.classpath
+++ b/examples/business/org.eclipse.uomo.examples.business.console/.classpath
@@ -1,31 +1,31 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" output="target/classes" path="src/main/java">
-		<attributes>
-			<attribute name="optional" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
-		<attributes>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
-		<attributes>
-			<attribute name="optional" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
-		<attributes>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
-		<attributes>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/examples/business/org.eclipse.uomo.examples.business.console/pom.xml b/examples/business/org.eclipse.uomo.examples.business.console/pom.xml
index 28faf72..3679e26 100644
--- a/examples/business/org.eclipse.uomo.examples.business.console/pom.xml
+++ b/examples/business/org.eclipse.uomo.examples.business.console/pom.xml
@@ -1,49 +1,49 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.eclipse.uomo.examples.business</groupId>
-		<artifactId>org.eclipse.uomo.examples.business</artifactId>
-		<version>0.7.0-SNAPSHOT</version>
-	</parent>
-	<artifactId>org.eclipse.uomo.examples.business.console</artifactId>
-	<name>UOMo Business Console Examples</name>
-
-	<dependencies>
-		<dependency>
-			<groupId>org.unitsofmeasurement</groupId>
-			<artifactId>unit-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.eclipse.uomo</groupId>
-			<artifactId>org.eclipse.uomo.units</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.eclipse.uomo</groupId>
-			<artifactId>org.eclipse.uomo.business</artifactId>
-		</dependency>
-
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.hamcrest</groupId>
-			<artifactId>hamcrest-all</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.eclipse.uomo</groupId>
-			<artifactId>org.eclipse.uomo.core</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.ibm.icu</groupId>
-			<artifactId>icu4j</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.eclipse</groupId>
-			<artifactId>osgi</artifactId>
-		</dependency>
-	</dependencies>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.uomo.examples.business</groupId>
+		<artifactId>org.eclipse.uomo.examples.business</artifactId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.uomo.examples.business.console</artifactId>
+	<name>UOMo Business Console Examples</name>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.unitsofmeasurement</groupId>
+			<artifactId>unit-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse.uomo</groupId>
+			<artifactId>org.eclipse.uomo.units</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse.uomo</groupId>
+			<artifactId>org.eclipse.uomo.business</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.hamcrest</groupId>
+			<artifactId>hamcrest-all</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse.uomo</groupId>
+			<artifactId>org.eclipse.uomo.core</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>com.ibm.icu</groupId>
+			<artifactId>icu4j</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse</groupId>
+			<artifactId>osgi</artifactId>
+		</dependency>
+	</dependencies>
 </project>
\ No newline at end of file
diff --git a/examples/business/pom.xml b/examples/business/pom.xml
index cb4edb6..133c763 100644
--- a/examples/business/pom.xml
+++ b/examples/business/pom.xml
@@ -1,35 +1,35 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<artifactId>org.eclipse.uomo.examples</artifactId>
-		<groupId>org.eclipse.uomo</groupId>
-		<version>0.7.0-SNAPSHOT</version>
-	</parent>
-	<artifactId>org.eclipse.uomo.examples.business</artifactId>
-	<packaging>pom</packaging>
-	<name>Eclipse UOMo Business Examples</name>
-	<modules>
-    <module>org.eclipse.uomo.examples.business.console</module>
-	</modules>
-	<!-- ==================================================== -->
-    <!-- Repositories. This is where Maven looks for dependencies. 
-         The Maven repository is implicit and doesn't need 
-         to be specified. -->
-    <!-- ==================================================== -->
-    <repositories>
-        <repository>
-            <id>maven-geotoolkit.org</id>
-            <name>GeoToolkit Repository for Maven</name>
-            <url>http://maven.geotoolkit.org/</url>
-        </repository>
-        
-        <repository>
-            <id>OpenL10n</id>
-            <name>Openl10.net</name>
-            <url>http://nexus.openl10n.net/content/groups/public/</url>
-        </repository>
-    </repositories>
-	
-    <groupId>org.eclipse.uomo.examples.business</groupId>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<artifactId>org.eclipse.uomo.examples</artifactId>
+		<groupId>org.eclipse.uomo</groupId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.uomo.examples.business</artifactId>
+	<packaging>pom</packaging>
+	<name>Eclipse UOMo Business Examples</name>
+	<modules>
+    <module>org.eclipse.uomo.examples.business.console</module>
+	</modules>
+	<!-- ==================================================== -->
+    <!-- Repositories. This is where Maven looks for dependencies. 
+         The Maven repository is implicit and doesn't need 
+         to be specified. -->
+    <!-- ==================================================== -->
+    <repositories>
+        <repository>
+            <id>maven-geotoolkit.org</id>
+            <name>GeoToolkit Repository for Maven</name>
+            <url>http://maven.geotoolkit.org/</url>
+        </repository>
+        
+        <repository>
+            <id>OpenL10n</id>
+            <name>Openl10.net</name>
+            <url>http://nexus.openl10n.net/content/groups/public/</url>
+        </repository>
+    </repositories>
+	
+    <groupId>org.eclipse.uomo.examples.business</groupId>
 </project>
\ No newline at end of file
diff --git a/examples/pom.xml b/examples/pom.xml
index 48248ed..7d7d06a 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -1,96 +1,96 @@
-<project
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
-	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-	<parent>
-		<artifactId>org.eclipse.uomo</artifactId>
-		<groupId>org.eclipse.uomo</groupId>
-		<version>0.7.0-SNAPSHOT</version>
-	</parent>
-	<modelVersion>4.0.0</modelVersion>
-	<artifactId>org.eclipse.uomo.examples</artifactId>
-	<packaging>pom</packaging>
-	<name>Eclipse UOMo Examples</name>
-	<build>
-		<plugins>
-			<!-- ======================================================= -->
-			<!-- Compilation -->
-			<!-- ======================================================= -->
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-compiler-plugin</artifactId>
-				<version>${maven.compilerPlugin.version}</version>
-				<configuration>
-					<source>${project.build.javaVersion}</source>
-					<target>${project.build.javaVersion}</target>
-					<encoding>${project.build.sourceEncoding}</encoding>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
-	<modules>
-		<module>business</module>
-		<module>units</module>
-		<module>ucum</module>
-	</modules>
-	<!-- modules> <module>org.eclipse.uomo.test</module> </modules -->
-
-	<dependencyManagement>
-		<dependencies>
-			<dependency>
-				<groupId>org.unitsofmeasurement</groupId>
-				<artifactId>unit-api</artifactId>
-				<version>0.6.1</version>
-			</dependency>
-			<dependency>
-				<groupId>org.eclipse.uomo</groupId>
-				<artifactId>org.eclipse.uomo.units</artifactId>
-				<version>${uomo-version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.eclipse.uomo</groupId>
-				<artifactId>org.eclipse.uomo.util</artifactId>
-				<version>${uomo-version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.eclipse.uomo</groupId>
-				<artifactId>org.eclipse.uomo.ucum</artifactId>
-				<version>${uomo-version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.eclipse.uomo</groupId>
-				<artifactId>org.eclipse.uomo.business</artifactId>
-				<version>${uomo-version}</version>
-			</dependency>
-
-			<dependency>
-				<groupId>junit</groupId>
-				<artifactId>junit</artifactId>
-				<version>4.8.1</version>
-				<scope>test</scope>
-			</dependency>
-			<dependency>
-				<groupId>org.hamcrest</groupId>
-				<artifactId>hamcrest-all</artifactId>
-				<version>1.1</version>
-				<scope>test</scope>
-			</dependency>
-			<dependency>
-				<groupId>org.eclipse.uomo</groupId>
-				<artifactId>org.eclipse.uomo.core</artifactId>
-				<version>${uomo-version}</version>
-			</dependency>
-			<dependency>
-				<groupId>com.ibm.icu</groupId>
-				<artifactId>icu4j</artifactId>
-				<version>${icu4j-version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.eclipse</groupId>
-				<artifactId>osgi</artifactId>
-				<version>3.5.0.v20090520</version>
-			</dependency>
-
-		</dependencies>
-	</dependencyManagement>
-
+<project
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<parent>
+		<artifactId>org.eclipse.uomo</artifactId>
+		<groupId>org.eclipse.uomo</groupId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+	<modelVersion>4.0.0</modelVersion>
+	<artifactId>org.eclipse.uomo.examples</artifactId>
+	<packaging>pom</packaging>
+	<name>Eclipse UOMo Examples</name>
+	<build>
+		<plugins>
+			<!-- ======================================================= -->
+			<!-- Compilation -->
+			<!-- ======================================================= -->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>${maven.compilerPlugin.version}</version>
+				<configuration>
+					<source>${project.build.javaVersion}</source>
+					<target>${project.build.javaVersion}</target>
+					<encoding>${project.build.sourceEncoding}</encoding>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+	<modules>
+		<module>business</module>
+		<module>units</module>
+		<module>ucum</module>
+	</modules>
+	<!-- modules> <module>org.eclipse.uomo.test</module> </modules -->
+
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>org.unitsofmeasurement</groupId>
+				<artifactId>unit-api</artifactId>
+				<version>0.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>org.eclipse.uomo</groupId>
+				<artifactId>org.eclipse.uomo.units</artifactId>
+				<version>${uomo-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.eclipse.uomo</groupId>
+				<artifactId>org.eclipse.uomo.util</artifactId>
+				<version>${uomo-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.eclipse.uomo</groupId>
+				<artifactId>org.eclipse.uomo.ucum</artifactId>
+				<version>${uomo-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.eclipse.uomo</groupId>
+				<artifactId>org.eclipse.uomo.business</artifactId>
+				<version>${uomo-version}</version>
+			</dependency>
+
+			<dependency>
+				<groupId>junit</groupId>
+				<artifactId>junit</artifactId>
+				<version>4.8.1</version>
+				<scope>test</scope>
+			</dependency>
+			<dependency>
+				<groupId>org.hamcrest</groupId>
+				<artifactId>hamcrest-all</artifactId>
+				<version>1.1</version>
+				<scope>test</scope>
+			</dependency>
+			<dependency>
+				<groupId>org.eclipse.uomo</groupId>
+				<artifactId>org.eclipse.uomo.core</artifactId>
+				<version>${uomo-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>com.ibm.icu</groupId>
+				<artifactId>icu4j</artifactId>
+				<version>${icu4j-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.eclipse</groupId>
+				<artifactId>osgi</artifactId>
+				<version>3.5.0.v20090520</version>
+			</dependency>
+
+		</dependencies>
+	</dependencyManagement>
+
 </project>
\ No newline at end of file
diff --git a/examples/ucum/.project b/examples/ucum/.project
index f426fbf..3dd2821 100644
--- a/examples/ucum/.project
+++ b/examples/ucum/.project
@@ -1,17 +1,17 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>ucum</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ucum</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/ucum/org.eclipse.uomo.examples.ucum.console/.classpath b/examples/ucum/org.eclipse.uomo.examples.ucum.console/.classpath
index 658fc2e..f32149e 100644
--- a/examples/ucum/org.eclipse.uomo.examples.ucum.console/.classpath
+++ b/examples/ucum/org.eclipse.uomo.examples.ucum.console/.classpath
@@ -1,31 +1,31 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" output="target/classes" path="src/main/java">
-		<attributes>
-			<attribute name="optional" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
-		<attributes>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
-		<attributes>
-			<attribute name="optional" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
-		<attributes>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
-		<attributes>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/examples/ucum/org.eclipse.uomo.examples.ucum.console/.project b/examples/ucum/org.eclipse.uomo.examples.ucum.console/.project
index 48f218d..151f97b 100644
--- a/examples/ucum/org.eclipse.uomo.examples.ucum.console/.project
+++ b/examples/ucum/org.eclipse.uomo.examples.ucum.console/.project
@@ -1,23 +1,23 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.uomo.examples.ucum.console</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.uomo.examples.ucum.console</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/ucum/org.eclipse.uomo.examples.ucum.console/pom.xml b/examples/ucum/org.eclipse.uomo.examples.ucum.console/pom.xml
index c949598..35fa906 100644
--- a/examples/ucum/org.eclipse.uomo.examples.ucum.console/pom.xml
+++ b/examples/ucum/org.eclipse.uomo.examples.ucum.console/pom.xml
@@ -1,52 +1,52 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.eclipse.uomo.examples.ucum</groupId>
-		<artifactId>org.eclipse.uomo.examples.ucum</artifactId>
-		<version>0.7.0-SNAPSHOT</version>
-	</parent>
-	<artifactId>org.eclipse.uomo.examples.ucum.console</artifactId>
-	<name>UOMo UCUM Console Examples</name>
-
-	<dependencies>
-		<dependency>
-			<groupId>com.ibm.icu</groupId>
-			<artifactId>icu4j</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.eclipse</groupId>
-			<artifactId>osgi</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.unitsofmeasurement</groupId>
-			<artifactId>unit-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.hamcrest</groupId>
-			<artifactId>hamcrest-all</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.eclipse.uomo</groupId>
-			<artifactId>org.eclipse.uomo.core</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.eclipse.uomo</groupId>
-			<artifactId>org.eclipse.uomo.units</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.eclipse.uomo</groupId>
-			<artifactId>org.eclipse.uomo.util</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.eclipse.uomo</groupId>
-			<artifactId>org.eclipse.uomo.ucum</artifactId>
-		</dependency>
-	</dependencies>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.uomo.examples.ucum</groupId>
+		<artifactId>org.eclipse.uomo.examples.ucum</artifactId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.uomo.examples.ucum.console</artifactId>
+	<name>UOMo UCUM Console Examples</name>
+
+	<dependencies>
+		<dependency>
+			<groupId>com.ibm.icu</groupId>
+			<artifactId>icu4j</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse</groupId>
+			<artifactId>osgi</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.unitsofmeasurement</groupId>
+			<artifactId>unit-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.hamcrest</groupId>
+			<artifactId>hamcrest-all</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse.uomo</groupId>
+			<artifactId>org.eclipse.uomo.core</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse.uomo</groupId>
+			<artifactId>org.eclipse.uomo.units</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse.uomo</groupId>
+			<artifactId>org.eclipse.uomo.util</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse.uomo</groupId>
+			<artifactId>org.eclipse.uomo.ucum</artifactId>
+		</dependency>
+	</dependencies>
 </project>
\ No newline at end of file
diff --git a/examples/ucum/org.eclipse.uomo.examples.ucum.console/src/main/java/org/eclipse/uomo/examples/ucum/console/UcumDemo.java b/examples/ucum/org.eclipse.uomo.examples.ucum.console/src/main/java/org/eclipse/uomo/examples/ucum/console/UcumDemo.java
index 2119b70..ab0f165 100644
--- a/examples/ucum/org.eclipse.uomo.examples.ucum.console/src/main/java/org/eclipse/uomo/examples/ucum/console/UcumDemo.java
+++ b/examples/ucum/org.eclipse.uomo.examples.ucum.console/src/main/java/org/eclipse/uomo/examples/ucum/console/UcumDemo.java
@@ -1,31 +1,31 @@
-package org.eclipse.uomo.examples.ucum.console;
-
-import java.math.BigDecimal;
-
-import org.eclipse.uomo.ucum.UcumService;
-import org.eclipse.uomo.ucum.impl.UcumEssenceService;
-
-public class UcumDemo {
-
-	public static void main(String[] args) {
-		final UcumService service = new UcumEssenceService(UcumDemo.class
-				.getClassLoader().getResourceAsStream("ucum-essence.xml"));
-		System.out.println("16 OZ to LBs    = "
-				+ service.convert(new BigDecimal(16), "[oz_av]", "[lb_av]"));
-		System.out.println("16 LBs to OZ    = "
-				+ service.convert(new BigDecimal(16), "[lb_av]", "[oz_av]"));
-		System.out.println("1 LB to Grams  = "
-				+ service.convert(new BigDecimal(1), "[lb_av]", "g"));
-		System.out.println("16 Oz to Grams  = "
-				+ service.convert(new BigDecimal(16), "[oz_av]", "g"));
-		System.out.println("1 Oz to Grams   = "
-				+ service.convert(new BigDecimal(1), "[oz_av]", "g"));
-		
-		System.out.println("1 Oz TR to Grams   = "
-				+ service.convert(new BigDecimal(1), "[oz_tr]", "g"));
-		
-		System.out.println("1 kg to Grams   = "
-				+ service.convert(new BigDecimal(1), "kg", "g"));
-	}
-
-}
+package org.eclipse.uomo.examples.ucum.console;
+
+import java.math.BigDecimal;
+
+import org.eclipse.uomo.ucum.UcumService;
+import org.eclipse.uomo.ucum.impl.UcumEssenceService;
+
+public class UcumDemo {
+
+	public static void main(String[] args) {
+		final UcumService service = new UcumEssenceService(UcumDemo.class
+				.getClassLoader().getResourceAsStream("ucum-essence.xml"));
+		System.out.println("16 OZ to LBs    = "
+				+ service.convert(new BigDecimal(16), "[oz_av]", "[lb_av]"));
+		System.out.println("16 LBs to OZ    = "
+				+ service.convert(new BigDecimal(16), "[lb_av]", "[oz_av]"));
+		System.out.println("1 LB to Grams  = "
+				+ service.convert(new BigDecimal(1), "[lb_av]", "g"));
+		System.out.println("16 Oz to Grams  = "
+				+ service.convert(new BigDecimal(16), "[oz_av]", "g"));
+		System.out.println("1 Oz to Grams   = "
+				+ service.convert(new BigDecimal(1), "[oz_av]", "g"));
+		
+		System.out.println("1 Oz TR to Grams   = "
+				+ service.convert(new BigDecimal(1), "[oz_tr]", "g"));
+		
+		System.out.println("1 kg to Grams   = "
+				+ service.convert(new BigDecimal(1), "kg", "g"));
+	}
+
+}
diff --git a/examples/ucum/org.eclipse.uomo.examples.ucum.console/src/main/resources/ucum-essence.xml b/examples/ucum/org.eclipse.uomo.examples.ucum.console/src/main/resources/ucum-essence.xml
index c6c6c9b..d45b615 100644
--- a/examples/ucum/org.eclipse.uomo.examples.ucum.console/src/main/resources/ucum-essence.xml
+++ b/examples/ucum/org.eclipse.uomo.examples.ucum.console/src/main/resources/ucum-essence.xml
@@ -1,2062 +1,2062 @@
-<?xml version="1.0" encoding="ascii"?>
-<root xmlns="http://unitsofmeasure.org/ucum-essence" version="1.9"
-      revision="$Revision: 16410 $"
-      revision-date="$Date: 2013-10-21 21:24:43 -0700 (Mon, 21 Oct 2013) $">
-   <prefix xmlns="" Code="Y" CODE="YA">
-      <name>yotta</name>
-      <printSymbol>Y</printSymbol>
-      <value value="1e24">1 &#215; 10<sup>24</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="Z" CODE="ZA">
-      <name>zetta</name>
-      <printSymbol>Z</printSymbol>
-      <value value="1e21">1 &#215; 10<sup>21</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="E" CODE="EX">
-      <name>exa</name>
-      <printSymbol>E</printSymbol>
-      <value value="1e18">1 &#215; 10<sup>18</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="P" CODE="PT">
-      <name>peta</name>
-      <printSymbol>P</printSymbol>
-      <value value="1e15">1 &#215; 10<sup>15</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="T" CODE="TR">
-      <name>tera</name>
-      <printSymbol>T</printSymbol>
-      <value value="1e12">1 &#215; 10<sup>12</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="G" CODE="GA">
-      <name>giga</name>
-      <printSymbol>G</printSymbol>
-      <value value="1e9">1 &#215; 10<sup>9</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="M" CODE="MA">
-      <name>mega</name>
-      <printSymbol>M</printSymbol>
-      <value value="1e6">1 &#215; 10<sup>6</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="k" CODE="K">
-      <name>kilo</name>
-      <printSymbol>k</printSymbol>
-      <value value="1e3">1 &#215; 10<sup>3</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="h" CODE="H">
-      <name>hecto</name>
-      <printSymbol>h</printSymbol>
-      <value value="1e2">1 &#215; 10<sup>2</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="da" CODE="DA">
-      <name>deka</name>
-      <printSymbol>da</printSymbol>
-      <value value="1e1">1 &#215; 10<sup>1</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="d" CODE="D">
-      <name>deci</name>
-      <printSymbol>d</printSymbol>
-      <value value="1e-1">1 &#215; 10<sup>-1</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="c" CODE="C">
-      <name>centi</name>
-      <printSymbol>c</printSymbol>
-      <value value="1e-2">1 &#215; 10<sup>-2</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="m" CODE="M">
-      <name>milli</name>
-      <printSymbol>m</printSymbol>
-      <value value="1e-3">1 &#215; 10<sup>-3</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="u" CODE="U">
-      <name>micro</name>
-      <printSymbol>&#956;</printSymbol>
-      <value value="1e-6">1 &#215; 10<sup>-6</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="n" CODE="N">
-      <name>nano</name>
-      <printSymbol>n</printSymbol>
-      <value value="1e-9">1 &#215; 10<sup>-9</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="p" CODE="P">
-      <name>pico</name>
-      <printSymbol>p</printSymbol>
-      <value value="1e-12">1 &#215; 10<sup>-12</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="f" CODE="F">
-      <name>femto</name>
-      <printSymbol>f</printSymbol>
-      <value value="1e-15">1 &#215; 10<sup>-15</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="a" CODE="A">
-      <name>atto</name>
-      <printSymbol>a</printSymbol>
-      <value value="1e-18">1 &#215; 10<sup>-18</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="z" CODE="ZO">
-      <name>zepto</name>
-      <printSymbol>z</printSymbol>
-      <value value="1e-21">1 &#215; 10<sup>-21</sup>
-      </value>
-   </prefix>
-   <prefix xmlns="" Code="y" CODE="YO">
-      <name>yocto</name>
-      <printSymbol>y</printSymbol>
-      <value value="1e-24">1 &#215; 10<sup>-24</sup>
-      </value>
-   </prefix>
-   <base-unit xmlns="" Code="m" CODE="M" dim="L">
-      <name>meter</name>
-      <printSymbol>m</printSymbol>
-      <property>length</property>
-   </base-unit>
-   <base-unit xmlns="" Code="s" CODE="S" dim="T">
-      <name>second</name>
-      <printSymbol>s</printSymbol>
-      <property>time</property>
-   </base-unit>
-   <base-unit xmlns="" Code="g" CODE="G" dim="M">
-      <name>gram</name>
-      <printSymbol>g</printSymbol>
-      <property>mass</property>
-   </base-unit>
-   <base-unit xmlns="" Code="rad" CODE="RAD" dim="A">
-      <name>radian</name>
-      <printSymbol>rad</printSymbol>
-      <property>plane angle</property>
-   </base-unit>
-   <base-unit xmlns="" Code="K" CODE="K" dim="C">
-      <name>Kelvin</name>
-      <printSymbol>K</printSymbol>
-      <property>temperature</property>
-   </base-unit>
-   <base-unit xmlns="" Code="C" CODE="C" dim="Q">
-      <name>Coulomb</name>
-      <printSymbol>C</printSymbol>
-      <property>electric charge</property>
-   </base-unit>
-   <base-unit xmlns="" Code="cd" CODE="CD" dim="F">
-      <name>candela</name>
-      <printSymbol>cd</printSymbol>
-      <property>luminous intensity</property>
-   </base-unit>
-   <unit xmlns="" Code="10*" CODE="10*" isMetric="no" class="dimless">
-      <name>the number ten for arbitrary powers</name>
-      <printSymbol>10</printSymbol>
-      <property>number</property>
-      <value Unit="1" UNIT="1" value="10">10</value>
-   </unit>
-   <unit xmlns="" Code="10^" CODE="10^" isMetric="no" class="dimless">
-      <name>the number ten for arbitrary powers</name>
-      <printSymbol>10</printSymbol>
-      <property>number</property>
-      <value Unit="1" UNIT="1" value="10">10</value>
-   </unit>
-   <unit xmlns="" Code="[pi]" CODE="[PI]" isMetric="no" class="dimless">
-      <name>the number pi</name>
-      <printSymbol>&#960;</printSymbol>
-      <property>number</property>
-      <value Unit="1" UNIT="1"
-             value="3.1415926535897932384626433832795028841971693993751058209749445923">&#960;</value>
-   </unit>
-   <unit xmlns="" Code="%" CODE="%" isMetric="no" class="dimless">
-      <name>percent</name>
-      <printSymbol>%</printSymbol>
-      <property>fraction</property>
-      <value Unit="10*-2" UNIT="10*-2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[ppth]" CODE="[PPTH]" isMetric="no" class="dimless">
-      <name>parts per thousand</name>
-      <printSymbol>ppth</printSymbol>
-      <property>fraction</property>
-      <value Unit="10*-3" UNIT="10*-3" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[ppm]" CODE="[PPM]" isMetric="no" class="dimless">
-      <name>parts per million</name>
-      <printSymbol>ppm</printSymbol>
-      <property>fraction</property>
-      <value Unit="10*-6" UNIT="10*-6" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[ppb]" CODE="[PPB]" isMetric="no" class="dimless">
-      <name>parts per billion</name>
-      <printSymbol>ppb</printSymbol>
-      <property>fraction</property>
-      <value Unit="10*-9" UNIT="10*-9" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[pptr]" CODE="[PPTR]" isMetric="no" class="dimless">
-      <name>parts per trillion</name>
-      <printSymbol>pptr</printSymbol>
-      <property>fraction</property>
-      <value Unit="10*-12" UNIT="10*-12" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="mol" CODE="MOL" isMetric="yes" class="si">
-      <name>mole</name>
-      <printSymbol>mol</printSymbol>
-      <property>amount of substance</property>
-      <value Unit="10*23" UNIT="10*23" value="6.0221367">6.0221367</value>
-   </unit>
-   <unit xmlns="" Code="sr" CODE="SR" isMetric="yes" class="si">
-      <name>steradian</name>
-      <printSymbol>sr</printSymbol>
-      <property>solid angle</property>
-      <value Unit="rad2" UNIT="RAD2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Hz" CODE="HZ" isMetric="yes" class="si">
-      <name>Hertz</name>
-      <printSymbol>Hz</printSymbol>
-      <property>frequency</property>
-      <value Unit="s-1" UNIT="S-1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="N" CODE="N" isMetric="yes" class="si">
-      <name>Newton</name>
-      <printSymbol>N</printSymbol>
-      <property>force</property>
-      <value Unit="kg.m/s2" UNIT="KG.M/S2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Pa" CODE="PAL" isMetric="yes" class="si">
-      <name>Pascal</name>
-      <printSymbol>Pa</printSymbol>
-      <property>pressure</property>
-      <value Unit="N/m2" UNIT="N/M2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="J" CODE="J" isMetric="yes" class="si">
-      <name>Joule</name>
-      <printSymbol>J</printSymbol>
-      <property>energy</property>
-      <value Unit="N.m" UNIT="N.M" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="W" CODE="W" isMetric="yes" class="si">
-      <name>Watt</name>
-      <printSymbol>W</printSymbol>
-      <property>power</property>
-      <value Unit="J/s" UNIT="J/S" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="A" CODE="A" isMetric="yes" class="si">
-      <name>Amp&#232;re</name>
-      <printSymbol>A</printSymbol>
-      <property>electric current</property>
-      <value Unit="C/s" UNIT="C/S" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="V" CODE="V" isMetric="yes" class="si">
-      <name>Volt</name>
-      <printSymbol>V</printSymbol>
-      <property>electric potential</property>
-      <value Unit="J/C" UNIT="J/C" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="F" CODE="F" isMetric="yes" class="si">
-      <name>Farad</name>
-      <printSymbol>F</printSymbol>
-      <property>electric capacitance</property>
-      <value Unit="C/V" UNIT="C/V" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Ohm" CODE="OHM" isMetric="yes" class="si">
-      <name>Ohm</name>
-      <printSymbol>&#937;</printSymbol>
-      <property>electric resistance</property>
-      <value Unit="V/A" UNIT="V/A" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="S" CODE="SIE" isMetric="yes" class="si">
-      <name>Siemens</name>
-      <printSymbol>S</printSymbol>
-      <property>electric conductance</property>
-      <value Unit="Ohm-1" UNIT="OHM-1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Wb" CODE="WB" isMetric="yes" class="si">
-      <name>Weber</name>
-      <printSymbol>Wb</printSymbol>
-      <property>magentic flux</property>
-      <value Unit="V.s" UNIT="V.S" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Cel" CODE="CEL" isMetric="yes" isSpecial="yes" class="si">
-      <name>degree Celsius</name>
-      <printSymbol>&#176;C</printSymbol>
-      <property>temperature</property>
-      <value Unit="cel(1 K)" UNIT="CEL(1 K)">
-         <function name="Cel" value="1" Unit="K"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="T" CODE="T" isMetric="yes" class="si">
-      <name>Tesla</name>
-      <printSymbol>T</printSymbol>
-      <property>magnetic flux density</property>
-      <value Unit="Wb/m2" UNIT="WB/M2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="H" CODE="H" isMetric="yes" class="si">
-      <name>Henry</name>
-      <printSymbol>H</printSymbol>
-      <property>inductance</property>
-      <value Unit="Wb/A" UNIT="WB/A" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="lm" CODE="LM" isMetric="yes" class="si">
-      <name>lumen</name>
-      <printSymbol>lm</printSymbol>
-      <property>luminous flux</property>
-      <value Unit="cd.sr" UNIT="CD.SR" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="lx" CODE="LX" isMetric="yes" class="si">
-      <name>lux</name>
-      <printSymbol>lx</printSymbol>
-      <property>illuminance</property>
-      <value Unit="lm/m2" UNIT="LM/M2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Bq" CODE="BQ" isMetric="yes" class="si">
-      <name>Becquerel</name>
-      <printSymbol>Bq</printSymbol>
-      <property>radioactivity</property>
-      <value Unit="s-1" UNIT="S-1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Gy" CODE="GY" isMetric="yes" class="si">
-      <name>Gray</name>
-      <printSymbol>Gy</printSymbol>
-      <property>energy dose</property>
-      <value Unit="J/kg" UNIT="J/KG" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Sv" CODE="SV" isMetric="yes" class="si">
-      <name>Sievert</name>
-      <printSymbol>Sv</printSymbol>
-      <property>dose equivalent</property>
-      <value Unit="J/kg" UNIT="J/KG" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="gon" CODE="GON" isMetric="no" class="iso1000">
-      <name>gon</name>
-      <name>grade</name>
-      <printSymbol>&#9633;<sup>g</sup>
-      </printSymbol>
-      <property>plane angle</property>
-      <value Unit="deg" UNIT="DEG" value="0.9">0.9</value>
-   </unit>
-   <unit xmlns="" Code="deg" CODE="DEG" isMetric="no" class="iso1000">
-      <name>degree</name>
-      <printSymbol>&#176;</printSymbol>
-      <property>plane angle</property>
-      <value Unit="[pi].rad/360" UNIT="[PI].RAD/360" value="2">2</value>
-   </unit>
-   <unit xmlns="" Code="'" CODE="'" isMetric="no" class="iso1000">
-      <name>minute</name>
-      <printSymbol>'</printSymbol>
-      <property>plane angle</property>
-      <value Unit="deg/60" UNIT="DEG/60" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="''" CODE="''" isMetric="no" class="iso1000">
-      <name>second</name>
-      <printSymbol>''</printSymbol>
-      <property>plane angle</property>
-      <value Unit="'/60" UNIT="'/60" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="l" CODE="L" isMetric="yes" class="iso1000">
-      <name>liter</name>
-      <printSymbol>l</printSymbol>
-      <property>volume</property>
-      <value Unit="dm3" UNIT="DM3" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="L" isMetric="yes" class="iso1000">
-      <name>liter</name>
-      <printSymbol>L</printSymbol>
-      <property>volume</property>
-      <value Unit="l" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="ar" CODE="AR" isMetric="yes" class="iso1000">
-      <name>are</name>
-      <printSymbol>a</printSymbol>
-      <property>area</property>
-      <value Unit="m2" UNIT="M2" value="100">100</value>
-   </unit>
-   <unit xmlns="" Code="min" CODE="MIN" isMetric="no" class="iso1000">
-      <name>minute</name>
-      <printSymbol>min</printSymbol>
-      <property>time</property>
-      <value Unit="s" UNIT="S" value="60">60</value>
-   </unit>
-   <unit xmlns="" Code="h" CODE="HR" isMetric="no" class="iso1000">
-      <name>hour</name>
-      <printSymbol>h</printSymbol>
-      <property>time</property>
-      <value Unit="min" UNIT="MIN" value="60">60</value>
-   </unit>
-   <unit xmlns="" Code="d" CODE="D" isMetric="no" class="iso1000">
-      <name>day</name>
-      <printSymbol>d</printSymbol>
-      <property>time</property>
-      <value Unit="h" UNIT="HR" value="24">24</value>
-   </unit>
-   <unit xmlns="" Code="a_t" CODE="ANN_T" isMetric="no" class="iso1000">
-      <name>tropical year</name>
-      <printSymbol>a<sub>t</sub>
-      </printSymbol>
-      <property>time</property>
-      <value Unit="d" UNIT="D" value="365.24219">365.24219</value>
-   </unit>
-   <unit xmlns="" Code="a_j" CODE="ANN_J" isMetric="no" class="iso1000">
-      <name>mean Julian year</name>
-      <printSymbol>a<sub>j</sub>
-      </printSymbol>
-      <property>time</property>
-      <value Unit="d" UNIT="D" value="365.25">365.25</value>
-   </unit>
-   <unit xmlns="" Code="a_g" CODE="ANN_G" isMetric="no" class="iso1000">
-      <name>mean Gregorian year</name>
-      <printSymbol>a<sub>g</sub>
-      </printSymbol>
-      <property>time</property>
-      <value Unit="d" UNIT="D" value="365.2425">365.2425</value>
-   </unit>
-   <unit xmlns="" Code="a" CODE="ANN" isMetric="no" class="iso1000">
-      <name>year</name>
-      <printSymbol>a</printSymbol>
-      <property>time</property>
-      <value Unit="a_j" UNIT="ANN_J" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="wk" CODE="WK" isMetric="no" class="iso1000">
-      <name>week</name>
-      <printSymbol>wk</printSymbol>
-      <property>time</property>
-      <value Unit="d" UNIT="D" value="7">7</value>
-   </unit>
-   <unit xmlns="" Code="mo_s" CODE="MO_S" isMetric="no" class="iso1000">
-      <name>synodal month</name>
-      <printSymbol>mo<sub>s</sub>
-      </printSymbol>
-      <property>time</property>
-      <value Unit="d" UNIT="D" value="29.53059">29.53059</value>
-   </unit>
-   <unit xmlns="" Code="mo_j" CODE="MO_J" isMetric="no" class="iso1000">
-      <name>mean Julian month</name>
-      <printSymbol>mo<sub>j</sub>
-      </printSymbol>
-      <property>time</property>
-      <value Unit="a_j/12" UNIT="ANN_J/12" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="mo_g" CODE="MO_G" isMetric="no" class="iso1000">
-      <name>mean Gregorian month</name>
-      <printSymbol>mo<sub>g</sub>
-      </printSymbol>
-      <property>time</property>
-      <value Unit="a_g/12" UNIT="ANN_G/12" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="mo" CODE="MO" isMetric="no" class="iso1000">
-      <name>month</name>
-      <printSymbol>mo</printSymbol>
-      <property>time</property>
-      <value Unit="mo_j" UNIT="MO_J" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="t" CODE="TNE" isMetric="yes" class="iso1000">
-      <name>tonne</name>
-      <printSymbol>t</printSymbol>
-      <property>mass</property>
-      <value Unit="kg" UNIT="KG" value="1e3">1 &#215; 10<sup>3</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="bar" CODE="BAR" isMetric="yes" class="iso1000">
-      <name>bar</name>
-      <printSymbol>bar</printSymbol>
-      <property>pressure</property>
-      <value Unit="Pa" UNIT="PAL" value="1e5">1 &#215; 10<sup>5</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="u" CODE="AMU" isMetric="yes" class="iso1000">
-      <name>unified atomic mass unit</name>
-      <printSymbol>u</printSymbol>
-      <property>mass</property>
-      <value Unit="g" UNIT="G" value="1.6605402e-24">1.6605402 &#215; 10<sup>-24</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="eV" CODE="EV" isMetric="yes" class="iso1000">
-      <name>electronvolt</name>
-      <printSymbol>eV</printSymbol>
-      <property>energy</property>
-      <value Unit="[e].V" UNIT="[E].V" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="AU" CODE="ASU" isMetric="no" class="iso1000">
-      <name>astronomic unit</name>
-      <printSymbol>AU</printSymbol>
-      <property>length</property>
-      <value Unit="Mm" UNIT="MAM" value="149597.870691">149597.870691</value>
-   </unit>
-   <unit xmlns="" Code="pc" CODE="PRS" isMetric="yes" class="iso1000">
-      <name>parsec</name>
-      <printSymbol>pc</printSymbol>
-      <property>length</property>
-      <value Unit="m" UNIT="M" value="3.085678e16">3.085678 &#215; 10<sup>16</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[c]" CODE="[C]" isMetric="yes" class="const">
-      <name>velocity of light</name>
-      <printSymbol>
-         <i>c</i>
-      </printSymbol>
-      <property>velocity</property>
-      <value Unit="m/s" UNIT="M/S" value="299792458">299792458</value>
-   </unit>
-   <unit xmlns="" Code="[h]" CODE="[H]" isMetric="yes" class="const">
-      <name>Planck constant</name>
-      <printSymbol>
-         <i>h</i>
-      </printSymbol>
-      <property>action</property>
-      <value Unit="J.s" UNIT="J.S" value="6.6260755e-24">6.6260755 &#215; 10<sup>-24</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[k]" CODE="[K]" isMetric="yes" class="const">
-      <name>Boltzmann constant</name>
-      <printSymbol>
-         <i>k</i>
-      </printSymbol>
-      <property>(unclassified)</property>
-      <value Unit="J/K" UNIT="J/K" value="1.380658e-23">1.380658 &#215; 10<sup>-23</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[eps_0]" CODE="[EPS_0]" isMetric="yes" class="const">
-      <name>permittivity of vacuum</name>
-      <printSymbol>
-         <i>&#949;<sub>
-               <r>0</r>
-            </sub>
-         </i>
-      </printSymbol>
-      <property>electric permittivity</property>
-      <value Unit="F/m" UNIT="F/M" value="8.854187817e-12">8.854187817 &#215; 10<sup>-12</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[mu_0]" CODE="[MU_0]" isMetric="yes" class="const">
-      <name>permeability of vacuum</name>
-      <printSymbol>
-         <i>&#956;<sub>
-               <r>0</r>
-            </sub>
-         </i>
-      </printSymbol>
-      <property>magnetic permeability</property>
-      <value Unit="4.[pi].10*-7.N/A2" UNIT="4.[PI].10*-7.N/A2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[e]" CODE="[E]" isMetric="yes" class="const">
-      <name>elementary charge</name>
-      <printSymbol>
-         <i>e</i>
-      </printSymbol>
-      <property>electric charge</property>
-      <value Unit="C" UNIT="C" value="1.60217733e-19">1.60217733 &#215; 10<sup>-19</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[m_e]" CODE="[M_E]" isMetric="yes" class="const">
-      <name>electron mass</name>
-      <printSymbol>
-         <i>m<sub>
-               <r>e</r>
-            </sub>
-         </i>
-      </printSymbol>
-      <property>mass</property>
-      <value Unit="g" UNIT="g" value="9.1093897e-28">9.1093897 &#215; 10<sup>-28</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[m_p]" CODE="[M_P]" isMetric="yes" class="const">
-      <name>proton mass</name>
-      <printSymbol>
-         <i>m<sub>
-               <r>p</r>
-            </sub>
-         </i>
-      </printSymbol>
-      <property>mass</property>
-      <value Unit="g" UNIT="g" value="1.6726231e-24">1.6726231 &#215; 10<sup>-24</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[G]" CODE="[GC]" isMetric="yes" class="const">
-      <name>Newtonian constant of gravitation</name>
-      <printSymbol>
-         <i>G</i>
-      </printSymbol>
-      <property>(unclassified)</property>
-      <value Unit="m3.kg-1.s-2" UNIT="M3.KG-1.S-2" value="6.67259e-11">6.67259 &#215; 10<sup>-11</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[g]" CODE="[G]" isMetric="yes" class="const">
-      <name>standard acceleration of free fall</name>
-      <printSymbol>
-         <i>g<sub>n</sub>
-         </i>
-      </printSymbol>
-      <property>acceleration</property>
-      <value Unit="m/s2" UNIT="M/S2" value="980665e-5">9.80665</value>
-   </unit>
-   <unit xmlns="" Code="atm" CODE="ATM" isMetric="no" class="const">
-      <name>standard atmosphere</name>
-      <printSymbol>atm</printSymbol>
-      <property>pressure</property>
-      <value Unit="Pa" UNIT="PAL" value="101325">101325</value>
-   </unit>
-   <unit xmlns="" Code="[ly]" CODE="[LY]" isMetric="yes" class="const">
-      <name>light-year</name>
-      <printSymbol>l.y.</printSymbol>
-      <property>length</property>
-      <value Unit="[c].a_j" UNIT="[C].ANN_J" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="gf" CODE="GF" isMetric="yes" class="const">
-      <name>gram-force</name>
-      <printSymbol>gf</printSymbol>
-      <property>force</property>
-      <value Unit="g.[g]" UNIT="G.[G]" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[lbf_av]" CODE="[LBF_AV]" isMetric="no" class="const">
-      <name>pound force</name>
-      <printSymbol>lbf</printSymbol>
-      <property>force</property>
-      <value Unit="[lb_av].[g]" UNIT="[LB_AV].[G]" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Ky" CODE="KY" isMetric="yes" class="cgs">
-      <name>Kayser</name>
-      <printSymbol>K</printSymbol>
-      <property>lineic number</property>
-      <value Unit="cm-1" UNIT="CM-1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Gal" CODE="GL" isMetric="yes" class="cgs">
-      <name>Gal</name>
-      <printSymbol>Gal</printSymbol>
-      <property>acceleration</property>
-      <value Unit="cm/s2" UNIT="CM/S2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="dyn" CODE="DYN" isMetric="yes" class="cgs">
-      <name>dyne</name>
-      <printSymbol>dyn</printSymbol>
-      <property>force</property>
-      <value Unit="g.cm/s2" UNIT="G.CM/S2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="erg" CODE="ERG" isMetric="yes" class="cgs">
-      <name>erg</name>
-      <printSymbol>erg</printSymbol>
-      <property>energy</property>
-      <value Unit="dyn.cm" UNIT="DYN.CM" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="P" CODE="P" isMetric="yes" class="cgs">
-      <name>Poise</name>
-      <printSymbol>P</printSymbol>
-      <property>dynamic viscosity</property>
-      <value Unit="dyn.s/cm2" UNIT="DYN.S/CM2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Bi" CODE="BI" isMetric="yes" class="cgs">
-      <name>Biot</name>
-      <printSymbol>Bi</printSymbol>
-      <property>electric current</property>
-      <value Unit="A" UNIT="A" value="10">10</value>
-   </unit>
-   <unit xmlns="" Code="St" CODE="ST" isMetric="yes" class="cgs">
-      <name>Stokes</name>
-      <printSymbol>St</printSymbol>
-      <property>kinematic viscosity</property>
-      <value Unit="cm2/s" UNIT="CM2/S" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Mx" CODE="MX" isMetric="yes" class="cgs">
-      <name>Maxwell</name>
-      <printSymbol>Mx</printSymbol>
-      <property>flux of magnetic induction</property>
-      <value Unit="Wb" UNIT="WB" value="1e-8">1 &#215; 10<sup>-8</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="G" CODE="GS" isMetric="yes" class="cgs">
-      <name>Gauss</name>
-      <printSymbol>Gs</printSymbol>
-      <property>magnetic flux density</property>
-      <value Unit="T" UNIT="T" value="1e-4">1 &#215; 10<sup>-4</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="Oe" CODE="OE" isMetric="yes" class="cgs">
-      <name>Oersted</name>
-      <printSymbol>Oe</printSymbol>
-      <property>magnetic field intensity</property>
-      <value Unit="/[pi].A/m" UNIT="/[PI].A/M" value="250">250</value>
-   </unit>
-   <unit xmlns="" Code="Gb" CODE="GB" isMetric="yes" class="cgs">
-      <name>Gilbert</name>
-      <printSymbol>Gb</printSymbol>
-      <property>magnetic tension</property>
-      <value Unit="Oe.cm" UNIT="OE.CM" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="sb" CODE="SB" isMetric="yes" class="cgs">
-      <name>stilb</name>
-      <printSymbol>sb</printSymbol>
-      <property>lum. intensity density</property>
-      <value Unit="cd/cm2" UNIT="CD/CM2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Lmb" CODE="LMB" isMetric="yes" class="cgs">
-      <name>Lambert</name>
-      <printSymbol>L</printSymbol>
-      <property>brightness</property>
-      <value Unit="cd/cm2/[pi]" UNIT="CD/CM2/[PI]" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="ph" CODE="PHT" isMetric="yes" class="cgs">
-      <name>phot</name>
-      <printSymbol>ph</printSymbol>
-      <property>illuminance</property>
-      <value Unit="lx" UNIT="LX" value="1e-4">1 &#215; 10<sup>-4</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="Ci" CODE="CI" isMetric="yes" class="cgs">
-      <name>Curie</name>
-      <printSymbol>Ci</printSymbol>
-      <property>radioactivity</property>
-      <value Unit="Bq" UNIT="BQ" value="37e9">3.7 &#215; 10<sup>10</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="R" CODE="ROE" isMetric="yes" class="cgs">
-      <name>Roentgen</name>
-      <printSymbol>R</printSymbol>
-      <property>ion dose</property>
-      <value Unit="C/kg" UNIT="C/KG" value="2.58e-4">2.58 &#215; 10<sup>-4</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="RAD" CODE="[RAD]" isMetric="yes" class="cgs">
-      <name>radiation absorbed dose</name>
-      <printSymbol>RAD</printSymbol>
-      <property>energy dose</property>
-      <value Unit="erg/g" UNIT="ERG/G" value="100">100</value>
-   </unit>
-   <unit xmlns="" Code="REM" CODE="[REM]" isMetric="yes" class="cgs">
-      <name>radiation equivalent man</name>
-      <printSymbol>REM</printSymbol>
-      <property>dose equivalent</property>
-      <value Unit="RAD" UNIT="[RAD]" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[in_i]" CODE="[IN_I]" isMetric="no" class="intcust">
-      <name>inch</name>
-      <printSymbol>in</printSymbol>
-      <property>length</property>
-      <value Unit="cm" UNIT="CM" value="254e-2">2.54</value>
-   </unit>
-   <unit xmlns="" Code="[ft_i]" CODE="[FT_I]" isMetric="no" class="intcust">
-      <name>foot</name>
-      <printSymbol>ft</printSymbol>
-      <property>length</property>
-      <value Unit="[in_i]" UNIT="[IN_I]" value="12">12</value>
-   </unit>
-   <unit xmlns="" Code="[yd_i]" CODE="[YD_I]" isMetric="no" class="intcust">
-      <name>yard</name>
-      <printSymbol>yd</printSymbol>
-      <property>length</property>
-      <value Unit="[ft_i]" UNIT="[FT_I]" value="3">3</value>
-   </unit>
-   <unit xmlns="" Code="[mi_i]" CODE="[MI_I]" isMetric="no" class="intcust">
-      <name>statute mile</name>
-      <printSymbol>mi</printSymbol>
-      <property>length</property>
-      <value Unit="[ft_i]" UNIT="[FT_I]" value="5280">5280</value>
-   </unit>
-   <unit xmlns="" Code="[fth_i]" CODE="[FTH_I]" isMetric="no" class="intcust">
-      <name>fathom</name>
-      <printSymbol>fth</printSymbol>
-      <property>depth of water</property>
-      <value Unit="[ft_i]" UNIT="[FT_I]" value="6">6</value>
-   </unit>
-   <unit xmlns="" Code="[nmi_i]" CODE="[NMI_I]" isMetric="no" class="intcust">
-      <name>nautical mile</name>
-      <printSymbol>n.mi</printSymbol>
-      <property>length</property>
-      <value Unit="m" UNIT="M" value="1852">1852</value>
-   </unit>
-   <unit xmlns="" Code="[kn_i]" CODE="[KN_I]" isMetric="no" class="intcust">
-      <name>knot</name>
-      <printSymbol>knot</printSymbol>
-      <property>velocity</property>
-      <value Unit="[nmi_i]/h" UNIT="[NMI_I]/H" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[sin_i]" CODE="[SIN_I]" isMetric="no" class="intcust">
-      <name>square inch</name>
-      <property>area</property>
-      <value Unit="[in_i]2" UNIT="[IN_I]2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[sft_i]" CODE="[SFT_I]" isMetric="no" class="intcust">
-      <name>square foot</name>
-      <property>area</property>
-      <value Unit="[ft_i]2" UNIT="[FT_I]2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[syd_i]" CODE="[SYD_I]" isMetric="no" class="intcust">
-      <name>square yard</name>
-      <property>area</property>
-      <value Unit="[yd_i]2" UNIT="[YD_I]2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[cin_i]" CODE="[CIN_I]" isMetric="no" class="intcust">
-      <name>cubic inch</name>
-      <property>volume</property>
-      <value Unit="[in_i]3" UNIT="[IN_I]3" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[cft_i]" CODE="[CFT_I]" isMetric="no" class="intcust">
-      <name>cubic foot</name>
-      <property>volume</property>
-      <value Unit="[ft_i]3" UNIT="[FT_I]3" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[cyd_i]" CODE="[CYD_I]" isMetric="no" class="intcust">
-      <name>cubic yard</name>
-      <printSymbol>cu.yd</printSymbol>
-      <property>volume</property>
-      <value Unit="[yd_i]3" UNIT="[YD_I]3" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[bf_i]" CODE="[BF_I]" isMetric="no" class="intcust">
-      <name>board foot</name>
-      <property>volume</property>
-      <value Unit="[in_i]3" UNIT="[IN_I]3" value="144">144</value>
-   </unit>
-   <unit xmlns="" Code="[cr_i]" CODE="[CR_I]" isMetric="no" class="intcust">
-      <name>cord</name>
-      <property>volume</property>
-      <value Unit="[ft_i]3" UNIT="[FT_I]3" value="128">128</value>
-   </unit>
-   <unit xmlns="" Code="[mil_i]" CODE="[MIL_I]" isMetric="no" class="intcust">
-      <name>mil</name>
-      <printSymbol>mil</printSymbol>
-      <property>length</property>
-      <value Unit="[in_i]" UNIT="[IN_I]" value="1e-3">1 &#215; 10<sup>-3</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[cml_i]" CODE="[CML_I]" isMetric="no" class="intcust">
-      <name>circular mil</name>
-      <printSymbol>circ.mil</printSymbol>
-      <property>area</property>
-      <value Unit="[pi]/4.[mil_i]2" UNIT="[PI]/4.[MIL_I]2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[hd_i]" CODE="[HD_I]" isMetric="no" class="intcust">
-      <name>hand</name>
-      <printSymbol>hd</printSymbol>
-      <property>height of horses</property>
-      <value Unit="[in_i]" UNIT="[IN_I]" value="4">4</value>
-   </unit>
-   <unit xmlns="" Code="[ft_us]" CODE="[FT_US]" isMetric="no" class="us-lengths">
-      <name>foot</name>
-      <printSymbol>ft<sub>us</sub>
-      </printSymbol>
-      <property>length</property>
-      <value Unit="m/3937" UNIT="M/3937" value="1200">1200</value>
-   </unit>
-   <unit xmlns="" Code="[yd_us]" CODE="[YD_US]" isMetric="no" class="us-lengths">
-      <name>yard</name>
-      <property>length</property>
-      <value Unit="[ft_us]" UNIT="[FT_US]" value="3">3</value>
-   </unit>
-   <unit xmlns="" Code="[in_us]" CODE="[IN_US]" isMetric="no" class="us-lengths">
-      <name>inch</name>
-      <property>length</property>
-      <value Unit="[ft_us]/12" UNIT="[FT_US]/12" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[rd_us]" CODE="[RD_US]" isMetric="no" class="us-lengths">
-      <name>rod</name>
-      <property>length</property>
-      <value Unit="[ft_us]" UNIT="[FT_US]" value="16.5">16.5</value>
-   </unit>
-   <unit xmlns="" Code="[ch_us]" CODE="[CH_US]" isMetric="no" class="us-lengths">
-      <name>Gunter's chain</name>
-      <name>Surveyor's chain</name>
-      <property>length</property>
-      <value Unit="[rd_us]" UNIT="[RD_US]" value="4">4</value>
-   </unit>
-   <unit xmlns="" Code="[lk_us]" CODE="[LK_US]" isMetric="no" class="us-lengths">
-      <name>link for Gunter's chain</name>
-      <property>length</property>
-      <value Unit="[ch_us]/100" UNIT="[CH_US]/100" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[rch_us]" CODE="[RCH_US]" isMetric="no" class="us-lengths">
-      <name>Ramden's chain</name>
-      <name>Engineer's chain</name>
-      <property>length</property>
-      <value Unit="[ft_us]" UNIT="[FT_US]" value="100">100</value>
-   </unit>
-   <unit xmlns="" Code="[rlk_us]" CODE="[RLK_US]" isMetric="no" class="us-lengths">
-      <name>link for Ramden's chain</name>
-      <property>length</property>
-      <value Unit="[rch_us]/100" UNIT="[RCH_US]/100" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[fth_us]" CODE="[FTH_US]" isMetric="no" class="us-lengths">
-      <name>fathom</name>
-      <property>length</property>
-      <value Unit="[ft_us]" UNIT="[FT_US]" value="6">6</value>
-   </unit>
-   <unit xmlns="" Code="[fur_us]" CODE="[FUR_US]" isMetric="no" class="us-lengths">
-      <name>furlong</name>
-      <property>length</property>
-      <value Unit="[rd_us]" UNIT="[RD_US]" value="40">40</value>
-   </unit>
-   <unit xmlns="" Code="[mi_us]" CODE="[MI_US]" isMetric="no" class="us-lengths">
-      <name>mile</name>
-      <property>length</property>
-      <value Unit="[fur_us]" UNIT="[FUR_US]" value="8">8</value>
-   </unit>
-   <unit xmlns="" Code="[acr_us]" CODE="[ACR_US]" isMetric="no" class="us-lengths">
-      <name>acre</name>
-      <property>area</property>
-      <value Unit="[rd_us]2" UNIT="[RD_US]2" value="160">160</value>
-   </unit>
-   <unit xmlns="" Code="[srd_us]" CODE="[SRD_US]" isMetric="no" class="us-lengths">
-      <name>square rod</name>
-      <property>area</property>
-      <value Unit="[rd_us]2" UNIT="[RD_US]2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[smi_us]" CODE="[SMI_US]" isMetric="no" class="us-lengths">
-      <name>square mile</name>
-      <property>area</property>
-      <value Unit="[mi_us]2" UNIT="[MI_US]2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[sct]" CODE="[SCT]" isMetric="no" class="us-lengths">
-      <name>section</name>
-      <property>area</property>
-      <value Unit="[mi_us]2" UNIT="[MI_US]2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[twp]" CODE="[TWP]" isMetric="no" class="us-lengths">
-      <name>township</name>
-      <property>area</property>
-      <value Unit="[sct]" UNIT="[SCT]" value="36">36</value>
-   </unit>
-   <unit xmlns="" Code="[mil_us]" CODE="[MIL_US]" isMetric="no" class="us-lengths">
-      <name>mil</name>
-      <property>length</property>
-      <value Unit="[in_us]" UNIT="[IN_US]" value="1e-3">1 &#215; 10<sup>-3</sup>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[in_br]" CODE="[IN_BR]" isMetric="no" class="brit-length">
-      <name>inch</name>
-      <property>length</property>
-      <value Unit="cm" UNIT="CM" value="2.539998">2.539998</value>
-   </unit>
-   <unit xmlns="" Code="[ft_br]" CODE="[FT_BR]" isMetric="no" class="brit-length">
-      <name>foot</name>
-      <property>length</property>
-      <value Unit="[in_br]" UNIT="[IN_BR]" value="12">12</value>
-   </unit>
-   <unit xmlns="" Code="[rd_br]" CODE="[RD_BR]" isMetric="no" class="brit-length">
-      <name>rod</name>
-      <property>length</property>
-      <value Unit="[ft_br]" UNIT="[FT_BR]" value="16.5">16.5</value>
-   </unit>
-   <unit xmlns="" Code="[ch_br]" CODE="[CH_BR]" isMetric="no" class="brit-length">
-      <name>Gunter's chain</name>
-      <property>length</property>
-      <value Unit="[rd_br]" UNIT="[RD_BR]" value="4">4</value>
-   </unit>
-   <unit xmlns="" Code="[lk_br]" CODE="[LK_BR]" isMetric="no" class="brit-length">
-      <name>link for Gunter's chain</name>
-      <property>length</property>
-      <value Unit="[ch_br]/100" UNIT="[CH_BR]/100" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[fth_br]" CODE="[FTH_BR]" isMetric="no" class="brit-length">
-      <name>fathom</name>
-      <property>length</property>
-      <value Unit="[ft_br]" UNIT="[FT_BR]" value="6">6</value>
-   </unit>
-   <unit xmlns="" Code="[pc_br]" CODE="[PC_BR]" isMetric="no" class="brit-length">
-      <name>pace</name>
-      <property>length</property>
-      <value Unit="[ft_br]" UNIT="[FT_BR]" value="2.5">2.5</value>
-   </unit>
-   <unit xmlns="" Code="[yd_br]" CODE="[YD_BR]" isMetric="no" class="brit-length">
-      <name>yard</name>
-      <property>length</property>
-      <value Unit="[ft_br]" UNIT="[FT_BR]" value="3">3</value>
-   </unit>
-   <unit xmlns="" Code="[mi_br]" CODE="[MI_BR]" isMetric="no" class="brit-length">
-      <name>mile</name>
-      <property>length</property>
-      <value Unit="[ft_br]" UNIT="[FT_BR]" value="5280">5280</value>
-   </unit>
-   <unit xmlns="" Code="[nmi_br]" CODE="[NMI_BR]" isMetric="no" class="brit-length">
-      <name>nautical mile</name>
-      <property>length</property>
-      <value Unit="[ft_br]" UNIT="[FT_BR]" value="6080">6080</value>
-   </unit>
-   <unit xmlns="" Code="[kn_br]" CODE="[KN_BR]" isMetric="no" class="brit-length">
-      <name>knot</name>
-      <property>velocity</property>
-      <value Unit="[nmi_br]/h" UNIT="[NMI_BR]/H" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[acr_br]" CODE="[ACR_BR]" isMetric="no" class="brit-length">
-      <name>acre</name>
-      <property>area</property>
-      <value Unit="[yd_br]2" UNIT="[YD_BR]2" value="4840">4840</value>
-   </unit>
-   <unit xmlns="" Code="[gal_us]" CODE="[GAL_US]" isMetric="no" class="us-volumes">
-      <name>Queen&#160;Anne's wine gallon</name>
-      <property>fluid volume</property>
-      <value Unit="[in_i]3" UNIT="[IN_I]3" value="231">231</value>
-   </unit>
-   <unit xmlns="" Code="[bbl_us]" CODE="[BBL_US]" isMetric="no" class="us-volumes">
-      <name>barrel</name>
-      <property>fluid volume</property>
-      <value Unit="[gal_us]" UNIT="[GAL_US]" value="42">42</value>
-   </unit>
-   <unit xmlns="" Code="[qt_us]" CODE="[QT_US]" isMetric="no" class="us-volumes">
-      <name>quart</name>
-      <property>fluid volume</property>
-      <value Unit="[gal_us]/4" UNIT="[GAL_US]/4" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[pt_us]" CODE="[PT_US]" isMetric="no" class="us-volumes">
-      <name>pint</name>
-      <property>fluid volume</property>
-      <value Unit="[qt_us]/2" UNIT="[QT_US]/2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[gil_us]" CODE="[GIL_US]" isMetric="no" class="us-volumes">
-      <name>gill</name>
-      <property>fluid volume</property>
-      <value Unit="[pt_us]/4" UNIT="[PT_US]/4" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[foz_us]" CODE="[FOZ_US]" isMetric="no" class="us-volumes">
-      <name>fluid ounce</name>
-      <printSymbol>oz fl</printSymbol>
-      <property>fluid volume</property>
-      <value Unit="[gil_us]/4" UNIT="[GIL_US]/4" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[fdr_us]" CODE="[FDR_US]" isMetric="no" class="us-volumes">
-      <name>fluid dram</name>
-      <property>fluid volume</property>
-      <value Unit="[foz_us]/8" UNIT="[FOZ_US]/8" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[min_us]" CODE="[MIN_US]" isMetric="no" class="us-volumes">
-      <name>minim</name>
-      <property>fluid volume</property>
-      <value Unit="[fdr_us]/60" UNIT="[FDR_US]/60" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[crd_us]" CODE="[CRD_US]" isMetric="no" class="us-volumes">
-      <name>cord</name>
-      <property>fluid volume</property>
-      <value Unit="[ft_i]3" UNIT="[FT_I]3" value="128">128</value>
-   </unit>
-   <unit xmlns="" Code="[bu_us]" CODE="[BU_US]" isMetric="no" class="us-volumes">
-      <name>bushel</name>
-      <property>dry volume</property>
-      <value Unit="[in_i]3" UNIT="[IN_I]3" value="2150.42">2150.42</value>
-   </unit>
-   <unit xmlns="" Code="[gal_wi]" CODE="[GAL_WI]" isMetric="no" class="us-volumes">
-      <name>historical winchester gallon</name>
-      <property>dry volume</property>
-      <value Unit="[bu_us]/8" UNIT="[BU_US]/8" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[pk_us]" CODE="[PK_US]" isMetric="no" class="us-volumes">
-      <name>peck</name>
-      <property>dry volume</property>
-      <value Unit="[bu_us]/4" UNIT="[BU_US]/4" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[dqt_us]" CODE="[DQT_US]" isMetric="no" class="us-volumes">
-      <name>dry quart</name>
-      <property>dry volume</property>
-      <value Unit="[pk_us]/8" UNIT="[PK_US]/8" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[dpt_us]" CODE="[DPT_US]" isMetric="no" class="us-volumes">
-      <name>dry pint</name>
-      <property>dry volume</property>
-      <value Unit="[dqt_us]/2" UNIT="[DQT_US]/2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[tbs_us]" CODE="[TBS_US]" isMetric="no" class="us-volumes">
-      <name>tablespoon</name>
-      <property>volume</property>
-      <value Unit="[foz_us]/2" UNIT="[FOZ_US]/2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[tsp_us]" CODE="[TSP_US]" isMetric="no" class="us-volumes">
-      <name>teaspoon</name>
-      <property>volume</property>
-      <value Unit="[tbs_us]/3" UNIT="[TBS_US]/3" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[cup_us]" CODE="[CUP_US]" isMetric="no" class="us-volumes">
-      <name>cup</name>
-      <property>volume</property>
-      <value Unit="[tbs_us]" UNIT="[TBS_US]" value="16">16</value>
-   </unit>
-   <unit xmlns="" Code="[foz_m]" CODE="[FOZ_M]" isMetric="no" class="us-volumes">
-      <name>metric fluid ounce</name>
-      <printSymbol>oz fl</printSymbol>
-      <property>fluid volume</property>
-      <value Unit="mL" UNIT="ML" value="30">30</value>
-   </unit>
-   <unit xmlns="" Code="[cup_m]" CODE="[CUP_M]" isMetric="no" class="us-volumes">
-      <name>metric cup</name>
-      <property>volume</property>
-      <value Unit="mL" UNIT="ML" value="240">240</value>
-   </unit>
-   <unit xmlns="" Code="[tsp_m]" CODE="[TSP_M]" isMetric="no" class="us-volumes">
-      <name>metric teaspoon</name>
-      <property>volume</property>
-      <value Unit="mL" UNIT="mL" value="5">5</value>
-   </unit>
-   <unit xmlns="" Code="[tbs_m]" CODE="[TBS_M]" isMetric="no" class="us-volumes">
-      <name>metric tablespoon</name>
-      <property>volume</property>
-      <value Unit="mL" UNIT="mL" value="15">15</value>
-   </unit>
-   <unit xmlns="" Code="[gal_br]" CODE="[GAL_BR]" isMetric="no" class="brit-volumes">
-      <name>gallon</name>
-      <property>volume</property>
-      <value Unit="l" UNIT="L" value="4.54609">4.54609</value>
-   </unit>
-   <unit xmlns="" Code="[pk_br]" CODE="[PK_BR]" isMetric="no" class="brit-volumes">
-      <name>peck</name>
-      <property>volume</property>
-      <value Unit="[gal_br]" UNIT="[GAL_BR]" value="2">2</value>
-   </unit>
-   <unit xmlns="" Code="[bu_br]" CODE="[BU_BR]" isMetric="no" class="brit-volumes">
-      <name>bushel</name>
-      <property>volume</property>
-      <value Unit="[pk_br]" UNIT="[PK_BR]" value="4">4</value>
-   </unit>
-   <unit xmlns="" Code="[qt_br]" CODE="[QT_BR]" isMetric="no" class="brit-volumes">
-      <name>quart</name>
-      <property>volume</property>
-      <value Unit="[gal_br]/4" UNIT="[GAL_BR]/4" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[pt_br]" CODE="[PT_BR]" isMetric="no" class="brit-volumes">
-      <name>pint</name>
-      <property>volume</property>
-      <value Unit="[qt_br]/2" UNIT="[QT_BR]/2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[gil_br]" CODE="[GIL_BR]" isMetric="no" class="brit-volumes">
-      <name>gill</name>
-      <property>volume</property>
-      <value Unit="[pt_br]/4" UNIT="[PT_BR]/4" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[foz_br]" CODE="[FOZ_BR]" isMetric="no" class="brit-volumes">
-      <name>fluid ounce</name>
-      <property>volume</property>
-      <value Unit="[gil_br]/5" UNIT="[GIL_BR]/5" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[fdr_br]" CODE="[FDR_BR]" isMetric="no" class="brit-volumes">
-      <name>fluid dram</name>
-      <property>volume</property>
-      <value Unit="[foz_br]/8" UNIT="[FOZ_BR]/8" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[min_br]" CODE="[MIN_BR]" isMetric="no" class="brit-volumes">
-      <name>minim</name>
-      <property>volume</property>
-      <value Unit="[fdr_br]/60" UNIT="[FDR_BR]/60" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[gr]" CODE="[GR]" isMetric="no" class="avoirdupois">
-      <name>grain</name>
-      <property>mass</property>
-      <value Unit="mg" UNIT="MG" value="64.79891">64.79891</value>
-   </unit>
-   <unit xmlns="" Code="[lb_av]" CODE="[LB_AV]" isMetric="no" class="avoirdupois">
-      <name>pound</name>
-      <printSymbol>lb</printSymbol>
-      <property>mass</property>
-      <value Unit="[gr]" UNIT="[GR]" value="7000">7000</value>
-   </unit>
-   <unit xmlns="" Code="[oz_av]" CODE="[OZ_AV]" isMetric="no" class="avoirdupois">
-      <name>ounce</name>
-      <printSymbol>oz</printSymbol>
-      <property>mass</property>
-      <value Unit="[lb_av]/16" UNIT="[LB_AV]/16" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[dr_av]" CODE="[DR_AV]" isMetric="no" class="avoirdupois">
-      <name>dram</name>
-      <property>mass</property>
-      <value Unit="[oz_av]/16" UNIT="[OZ_AV]/16" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[scwt_av]" CODE="[SCWT_AV]" isMetric="no" class="avoirdupois">
-      <name>short hundredweight</name>
-      <name>U.S. hundredweight</name>
-      <property>mass</property>
-      <value Unit="[lb_av]" UNIT="[LB_AV]" value="100">100</value>
-   </unit>
-   <unit xmlns="" Code="[lcwt_av]" CODE="[LCWT_AV]" isMetric="no" class="avoirdupois">
-      <name>long hunderdweight</name>
-      <name>British hundredweight</name>
-      <property>mass</property>
-      <value Unit="[lb_av]" UNIT="[LB_AV]" value="112">112</value>
-   </unit>
-   <unit xmlns="" Code="[ston_av]" CODE="[STON_AV]" isMetric="no" class="avoirdupois">
-      <name>short ton</name>
-      <name>U.S. ton</name>
-      <property>mass</property>
-      <value Unit="[scwt_av]" UNIT="[SCWT_AV]" value="20">20</value>
-   </unit>
-   <unit xmlns="" Code="[lton_av]" CODE="[LTON_AV]" isMetric="no" class="avoirdupois">
-      <name>long ton</name>
-      <name>British ton</name>
-      <property>mass</property>
-      <value Unit="[lcwt_av]" UNIT="[LCWT_AV]" value="20">20</value>
-   </unit>
-   <unit xmlns="" Code="[stone_av]" CODE="[STONE_AV]" isMetric="no" class="avoirdupois">
-      <name>stone</name>
-      <name>British stone</name>
-      <property>mass</property>
-      <value Unit="[lb_av]" UNIT="[LB_AV]" value="14">14</value>
-   </unit>
-   <unit xmlns="" Code="[pwt_tr]" CODE="[PWT_TR]" isMetric="no" class="troy">
-      <name>pennyweight</name>
-      <property>mass</property>
-      <value Unit="[gr]" UNIT="[GR]" value="24">24</value>
-   </unit>
-   <unit xmlns="" Code="[oz_tr]" CODE="[OZ_TR]" isMetric="no" class="troy">
-      <name>ounce</name>
-      <property>mass</property>
-      <value Unit="[pwt_tr]" UNIT="[PWT_TR]" value="20">20</value>
-   </unit>
-   <unit xmlns="" Code="[lb_tr]" CODE="[LB_TR]" isMetric="no" class="troy">
-      <name>pound</name>
-      <property>mass</property>
-      <value Unit="[oz_tr]" UNIT="[OZ_TR]" value="12">12</value>
-   </unit>
-   <unit xmlns="" Code="[sc_ap]" CODE="[SC_AP]" isMetric="no" class="apoth">
-      <name>scruple</name>
-      <property>mass</property>
-      <value Unit="[gr]" UNIT="[GR]" value="20">20</value>
-   </unit>
-   <unit xmlns="" Code="[dr_ap]" CODE="[DR_AP]" isMetric="no" class="apoth">
-      <name>dram</name>
-      <name>drachm</name>
-      <property>mass</property>
-      <value Unit="[sc_ap]" UNIT="[SC_AP]" value="3">3</value>
-   </unit>
-   <unit xmlns="" Code="[oz_ap]" CODE="[OZ_AP]" isMetric="no" class="apoth">
-      <name>ounce</name>
-      <property>mass</property>
-      <value Unit="[dr_ap]" UNIT="[DR_AP]" value="8">8</value>
-   </unit>
-   <unit xmlns="" Code="[lb_ap]" CODE="[LB_AP]" isMetric="no" class="apoth">
-      <name>pound</name>
-      <property>mass</property>
-      <value Unit="[oz_ap]" UNIT="[OZ_AP]" value="12">12</value>
-   </unit>
-   <unit xmlns="" Code="[oz_m]" CODE="[OZ_M]" isMetric="no" class="apoth">
-      <name>metric ounce</name>
-      <property>mass</property>
-      <value Unit="g" UNIT="g" value="28">28</value>
-   </unit>
-   <unit xmlns="" Code="[lne]" CODE="[LNE]" isMetric="no" class="typeset">
-      <name>line</name>
-      <property>length</property>
-      <value Unit="[in_i]/12" UNIT="[IN_I]/12" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[pnt]" CODE="[PNT]" isMetric="no" class="typeset">
-      <name>point</name>
-      <property>length</property>
-      <value Unit="[lne]/6" UNIT="[LNE]/6" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[pca]" CODE="[PCA]" isMetric="no" class="typeset">
-      <name>pica</name>
-      <property>length</property>
-      <value Unit="[pnt]" UNIT="[PNT]" value="12">12</value>
-   </unit>
-   <unit xmlns="" Code="[pnt_pr]" CODE="[PNT_PR]" isMetric="no" class="typeset">
-      <name>Printer's point</name>
-      <property>length</property>
-      <value Unit="[in_i]" UNIT="[IN_I]" value="0.013837">0.013837</value>
-   </unit>
-   <unit xmlns="" Code="[pca_pr]" CODE="[PCA_PR]" isMetric="no" class="typeset">
-      <name>Printer's pica</name>
-      <property>length</property>
-      <value Unit="[pnt_pr]" UNIT="[PNT_PR]" value="12">12</value>
-   </unit>
-   <unit xmlns="" Code="[pied]" CODE="[PIED]" isMetric="no" class="typeset">
-      <name>pied</name>
-      <name>French foot</name>
-      <property>length</property>
-      <value Unit="cm" UNIT="CM" value="32.48">32.48</value>
-   </unit>
-   <unit xmlns="" Code="[pouce]" CODE="[POUCE]" isMetric="no" class="typeset">
-      <name>pouce</name>
-      <name>French inch</name>
-      <property>length</property>
-      <value Unit="[pied]/12" UNIT="[PIED]/12" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[ligne]" CODE="[LIGNE]" isMetric="no" class="typeset">
-      <name>ligne</name>
-      <name>French line</name>
-      <property>length</property>
-      <value Unit="[pouce]/12" UNIT="[POUCE]/12" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[didot]" CODE="[DIDOT]" isMetric="no" class="typeset">
-      <name>didot</name>
-      <name>Didot's point</name>
-      <property>length</property>
-      <value Unit="[ligne]/6" UNIT="[LIGNE]/6" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[cicero]" CODE="[CICERO]" isMetric="no" class="typeset">
-      <name>cicero</name>
-      <name>Didot's pica</name>
-      <property>length</property>
-      <value Unit="[didot]" UNIT="[DIDOT]" value="12">12</value>
-   </unit>
-   <unit xmlns="" Code="[degF]" CODE="[DEGF]" isMetric="no" isSpecial="yes" class="heat">
-      <name>degree Fahrenheit</name>
-      <printSymbol>&#176;F</printSymbol>
-      <property>temperature</property>
-      <value Unit="degf(5 K/9)" UNIT="DEGF(5 K/9)">
-         <function name="degF" value="5" Unit="K/9"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[degR]" CODE="[degR]" isMetric="no" class="heat">
-      <name>degree Rankine</name>
-      <printSymbol>&#176;R</printSymbol>
-      <property>temperature</property>
-      <value value="5" Unit="K/9" UNIT="K/9">5</value>
-   </unit>
-   <unit xmlns="" Code="cal_[15]" CODE="CAL_[15]" isMetric="yes" class="heat">
-      <name>calorie at 15&#160;&#176;C</name>
-      <printSymbol>cal<sub>15&#176;C</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="J" UNIT="J" value="4.18580">4.18580</value>
-   </unit>
-   <unit xmlns="" Code="cal_[20]" CODE="CAL_[20]" isMetric="yes" class="heat">
-      <name>calorie at 20&#160;&#176;C</name>
-      <printSymbol>cal<sub>20&#176;C</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="J" UNIT="J" value="4.18190">4.18190</value>
-   </unit>
-   <unit xmlns="" Code="cal_m" CODE="CAL_M" isMetric="yes" class="heat">
-      <name>mean calorie</name>
-      <printSymbol>cal<sub>m</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="J" UNIT="J" value="4.19002">4.19002</value>
-   </unit>
-   <unit xmlns="" Code="cal_IT" CODE="CAL_IT" isMetric="yes" class="heat">
-      <name>international table calorie</name>
-      <printSymbol>cal<sub>IT</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="J" UNIT="J" value="4.1868">4.1868</value>
-   </unit>
-   <unit xmlns="" Code="cal_th" CODE="CAL_TH" isMetric="yes" class="heat">
-      <name>thermochemical calorie</name>
-      <printSymbol>cal<sub>th</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="J" UNIT="J" value="4.184">4.184</value>
-   </unit>
-   <unit xmlns="" Code="cal" CODE="CAL" isMetric="yes" class="heat">
-      <name>calorie</name>
-      <printSymbol>cal</printSymbol>
-      <property>energy</property>
-      <value Unit="cal_th" UNIT="CAL_TH" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[Cal]" CODE="[CAL]" isMetric="no" class="heat">
-      <name>nutrition label Calories</name>
-      <printSymbol>Cal</printSymbol>
-      <property>energy</property>
-      <value Unit="kcal_th" UNIT="KCAL_TH" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[Btu_39]" CODE="[BTU_39]" isMetric="no" class="heat">
-      <name>British thermal unit at 39&#160;&#176;F</name>
-      <printSymbol>Btu<sub>39&#176;F</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="kJ" UNIT="kJ" value="1.05967">1.05967</value>
-   </unit>
-   <unit xmlns="" Code="[Btu_59]" CODE="[BTU_59]" isMetric="no" class="heat">
-      <name>British thermal unit at 59&#160;&#176;F</name>
-      <printSymbol>Btu<sub>59&#176;F</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="kJ" UNIT="kJ" value="1.05480">1.05480</value>
-   </unit>
-   <unit xmlns="" Code="[Btu_60]" CODE="[BTU_60]" isMetric="no" class="heat">
-      <name>British thermal unit at 60&#160;&#176;F</name>
-      <printSymbol>Btu<sub>60&#176;F</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="kJ" UNIT="kJ" value="1.05468">1.05468</value>
-   </unit>
-   <unit xmlns="" Code="[Btu_m]" CODE="[BTU_M]" isMetric="no" class="heat">
-      <name>mean British thermal unit</name>
-      <printSymbol>Btu<sub>m</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="kJ" UNIT="kJ" value="1.05587">1.05587</value>
-   </unit>
-   <unit xmlns="" Code="[Btu_IT]" CODE="[BTU_IT]" isMetric="no" class="heat">
-      <name>international table British thermal unit</name>
-      <printSymbol>Btu<sub>IT</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="kJ" UNIT="kJ" value="1.05505585262">1.05505585262</value>
-   </unit>
-   <unit xmlns="" Code="[Btu_th]" CODE="[BTU_TH]" isMetric="no" class="heat">
-      <name>thermochemical British thermal unit</name>
-      <printSymbol>Btu<sub>th</sub>
-      </printSymbol>
-      <property>energy</property>
-      <value Unit="kJ" UNIT="kJ" value="1.054350">1.054350</value>
-   </unit>
-   <unit xmlns="" Code="[Btu]" CODE="[BTU]" isMetric="no" class="heat">
-      <name>British thermal unit</name>
-      <printSymbol>btu</printSymbol>
-      <property>energy</property>
-      <value Unit="[Btu_th]" UNIT="[BTU_TH]" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[HP]" CODE="[HP]" isMetric="no" class="heat">
-      <name>horsepower</name>
-      <property>power</property>
-      <value Unit="[ft_i].[lbf_av]/s" UNIT="[FT_I].[LBF_AV]/S" value="550">550</value>
-   </unit>
-   <unit xmlns="" Code="tex" CODE="TEX" isMetric="yes" class="heat">
-      <name>tex</name>
-      <printSymbol>tex</printSymbol>
-      <property>linear mass density (of textile thread)</property>
-      <value value="1" Unit="g/km" UNIT="G/KM">1</value>
-   </unit>
-   <unit xmlns="" Code="[den]" CODE="[DEN]" isMetric="no" class="heat">
-      <name>Denier</name>
-      <printSymbol>den</printSymbol>
-      <property>linear mass density (of textile thread)</property>
-      <value value="1" Unit="g/9/km" UNIT="G/9/KM">1</value>
-   </unit>
-   <unit xmlns="" Code="m[H2O]" CODE="M[H2O]" isMetric="yes" class="clinical">
-      <name>meter of water column</name>
-      <printSymbol>m&#160;H<sub>
-            <r>2</r>
-         </sub>O</printSymbol>
-      <property>pressure</property>
-      <value Unit="kPa" UNIT="KPAL" value="980665e-5">9.80665</value>
-   </unit>
-   <unit xmlns="" Code="m[Hg]" CODE="M[HG]" isMetric="yes" class="clinical">
-      <name>meter of mercury column</name>
-      <printSymbol>m&#160;Hg</printSymbol>
-      <property>pressure</property>
-      <value Unit="kPa" UNIT="KPAL" value="133.3220">133.3220</value>
-   </unit>
-   <unit xmlns="" Code="[in_i'H2O]" CODE="[IN_I'H2O]" isMetric="no" class="clinical">
-      <name>inch of water column</name>
-      <printSymbol>in&#160;H<sub>
-            <r>2</r>
-         </sub>O</printSymbol>
-      <property>pressure</property>
-      <value Unit="m[H2O].[in_i]/m" UNIT="M[H2O].[IN_I]/M" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[in_i'Hg]" CODE="[IN_I'HG]" isMetric="no" class="clinical">
-      <name>inch of mercury column</name>
-      <printSymbol>in&#160;Hg</printSymbol>
-      <property>pressure</property>
-      <value Unit="m[Hg].[in_i]/m" UNIT="M[HG].[IN_I]/M" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[PRU]" CODE="[PRU]" isMetric="no" class="clinical">
-      <name>peripheral vascular resistance unit</name>
-      <printSymbol>P.R.U.</printSymbol>
-      <property>fluid resistance</property>
-      <value Unit="mm[Hg].s/ml" UNIT="MM[HG].S/ML" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[wood'U]" CODE="[WOOD'U]" isMetric="no" class="clinical">
-      <name>Wood unit</name>
-      <printSymbol>Wood U.</printSymbol>
-      <property>fluid resistance</property>
-      <value Unit="mm[Hg].min/L" UNIT="MM[HG].MIN/L" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[diop]" CODE="[DIOP]" isMetric="no" class="clinical">
-      <name>diopter</name>
-      <printSymbol>dpt</printSymbol>
-      <property>refraction of a lens</property>
-      <value Unit="/m" UNIT="/M" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[p'diop]" CODE="[P'DIOP]" isMetric="no" isSpecial="yes"
-         class="clinical">
-      <name>prism diopter</name>
-      <printSymbol>PD</printSymbol>
-      <property>refraction of a prism</property>
-      <value Unit="100tan(1 rad)" UNIT="100TAN(1 RAD)">
-         <function name="tanTimes100" value="1" Unit="deg"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="%[slope]" CODE="%[SLOPE]" isMetric="no" isSpecial="yes"
-         class="clinical">
-      <name>percent of slope</name>
-      <printSymbol>%</printSymbol>
-      <property>slope</property>
-      <value Unit="100tan(1 rad)" UNIT="100TAN(1 RAD)">
-         <function name="100tan" value="1" Unit="deg"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[mesh_i]" CODE="[MESH_I]" isMetric="no" class="clinical">
-      <name>mesh</name>
-      <property>lineic number</property>
-      <value Unit="/[in_i]" UNIT="/[IN_I]" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[Ch]" CODE="[CH]" isMetric="no" class="clinical">
-      <name>Charri&#232;re</name>
-      <name>french</name>
-      <printSymbol>Ch</printSymbol>
-      <property>gauge of catheters</property>
-      <value Unit="mm/3" UNIT="MM/3" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[drp]" CODE="[DRP]" isMetric="no" class="clinical">
-      <name>drop</name>
-      <printSymbol>drp</printSymbol>
-      <property>volume</property>
-      <value Unit="ml/20" UNIT="ML/20" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[hnsf'U]" CODE="[HNSF'U]" isMetric="no" class="clinical">
-      <name>Hounsfield unit</name>
-      <printSymbol>HF</printSymbol>
-      <property>x-ray attenuation</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[MET]" CODE="[MET]" isMetric="no" class="clinical">
-      <name>metabolic equivalent</name>
-      <printSymbol>MET</printSymbol>
-      <property>metabolic cost of physical activity</property>
-      <value Unit="mL/min/kg" UNIT="ML/MIN/KG" value="3.5">3.5</value>
-   </unit>
-   <unit xmlns="" Code="[hp'_X]" CODE="[HP'_X]" isMetric="no" isSpecial="yes"
-         class="clinical">
-      <name>homeopathic potency of decimal series (retired)</name>
-      <printSymbol>X</printSymbol>
-      <property>homeopathic potency (retired)</property>
-      <value Unit="hpX(1 1)" UNIT="HPX(1 1)">
-         <function name="hpX" value="1" Unit="1"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[hp'_C]" CODE="[HP'_C]" isMetric="no" isSpecial="yes"
-         class="clinical">
-      <name>homeopathic potency of centesimal series (retired)</name>
-      <printSymbol>C</printSymbol>
-      <property>homeopathic potency (retired)</property>
-      <value Unit="hpC(1 1)" UNIT="HPC(1 1)">
-         <function name="hpC" value="1" Unit="1"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[hp'_M]" CODE="[HP'_M]" isMetric="no" isSpecial="yes"
-         class="clinical">
-      <name>homeopathic potency of millesimal series (retired)</name>
-      <printSymbol>M</printSymbol>
-      <property>homeopathic potency (retired)</property>
-      <value Unit="hpM(1 1)" UNIT="HPM(1 1)">
-         <function name="hpM" value="1" Unit="1"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[hp'_Q]" CODE="[HP'_Q]" isMetric="no" isSpecial="yes"
-         class="clinical">
-      <name>homeopathic potency of quintamillesimal series (retired)</name>
-      <printSymbol>Q</printSymbol>
-      <property>homeopathic potency (retired)</property>
-      <value Unit="hpQ(1 1)" UNIT="HPQ(1 1)">
-         <function name="hpQ" value="1" Unit="1"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="[hp_X]" CODE="[HP_X]" isMetric="no" isArbitrary="yes"
-         class="clinical">
-      <name>homeopathic potency of decimal hahnemannian series</name>
-      <printSymbol>X</printSymbol>
-      <property>homeopathic potency (Hahnemann)</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[hp_C]" CODE="[HP_C]" isMetric="no" isArbitrary="yes"
-         class="clinical">
-      <name>homeopathic potency of centesimal hahnemannian series</name>
-      <printSymbol>C</printSymbol>
-      <property>homeopathic potency (Hahnemann)</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[hp_M]" CODE="[HP_M]" isMetric="no" isArbitrary="yes"
-         class="clinical">
-      <name>homeopathic potency of millesimal hahnemannian series</name>
-      <printSymbol>M</printSymbol>
-      <property>homeopathic potency (Hahnemann)</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[hp_Q]" CODE="[HP_Q]" isMetric="no" isArbitrary="yes"
-         class="clinical">
-      <name>homeopathic potency of quintamillesimal hahnemannian series</name>
-      <printSymbol>Q</printSymbol>
-      <property>homeopathic potency (Hahnemann)</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[kp_X]" CODE="[KP_X]" isMetric="no" isArbitrary="yes"
-         class="clinical">
-      <name>homeopathic potency of decimal korsakovian series</name>
-      <printSymbol>X</printSymbol>
-      <property>homeopathic potency (Korsakov)</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[kp_C]" CODE="[KP_C]" isMetric="no" isArbitrary="yes"
-         class="clinical">
-      <name>homeopathic potency of centesimal korsakovian series</name>
-      <printSymbol>C</printSymbol>
-      <property>homeopathic potency (Korsakov)</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[kp_M]" CODE="[KP_M]" isMetric="no" isArbitrary="yes"
-         class="clinical">
-      <name>homeopathic potency of millesimal korsakovian series</name>
-      <printSymbol>M</printSymbol>
-      <property>homeopathic potency (Korsakov)</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[kp_Q]" CODE="[KP_Q]" isMetric="no" isArbitrary="yes"
-         class="clinical">
-      <name>homeopathic potency of quintamillesimal korsakovian series</name>
-      <printSymbol>Q</printSymbol>
-      <property>homeopathic potency (Korsakov)</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="eq" CODE="EQ" isMetric="yes" class="chemical">
-      <name>equivalents</name>
-      <printSymbol>eq</printSymbol>
-      <property>amount of substance</property>
-      <value Unit="mol" UNIT="MOL" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="osm" CODE="OSM" isMetric="yes" class="chemical">
-      <name>osmole</name>
-      <printSymbol>osm</printSymbol>
-      <property>amount of substance (dissolved particles)</property>
-      <value Unit="mol" UNIT="MOL" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[pH]" CODE="[PH]" isMetric="no" isSpecial="yes" class="chemical">
-      <name>pH</name>
-      <printSymbol>pH</printSymbol>
-      <property>acidity</property>
-      <value Unit="pH(1 mol/l)" UNIT="PH(1 MOL/L)">
-         <function name="pH" value="1" Unit="mol/l"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="g%" CODE="G%" isMetric="yes" class="chemical">
-      <name>gram percent</name>
-      <printSymbol>g%</printSymbol>
-      <property>mass concentration</property>
-      <value Unit="g/dl" UNIT="G/DL" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[S]" CODE="[S]" isMetric="no" class="chemical">
-      <name>Svedberg unit</name>
-      <printSymbol>S</printSymbol>
-      <property>sedimentation coefficient</property>
-      <value Unit="10*-13.s" UNIT="10*-13.S" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[HPF]" CODE="[HPF]" isMetric="no" class="chemical">
-      <name>high power field</name>
-      <printSymbol>HPF</printSymbol>
-      <property>view area in microscope</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[LPF]" CODE="[LPF]" isMetric="no" class="chemical">
-      <name>low power field</name>
-      <printSymbol>LPF</printSymbol>
-      <property>view area in microscope</property>
-      <value Unit="1" UNIT="1" value="100">100</value>
-   </unit>
-   <unit xmlns="" Code="kat" CODE="KAT" isMetric="yes" class="chemical">
-      <name>katal</name>
-      <printSymbol>kat</printSymbol>
-      <property>catalytic activity</property>
-      <value Unit="mol/s" UNIT="MOL/S" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="U" CODE="U" isMetric="yes" class="chemical">
-      <name>Unit</name>
-      <printSymbol>U</printSymbol>
-      <property>catalytic activity</property>
-      <value Unit="umol/min" UNIT="UMOL/MIN" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[iU]" CODE="[IU]" isMetric="yes" isArbitrary="yes"
-         class="chemical">
-      <name>international unit</name>
-      <printSymbol>IU</printSymbol>
-      <property>arbitrary</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[IU]" CODE="[IU]" isMetric="yes" isArbitrary="yes"
-         class="chemical">
-      <name>international unit</name>
-      <printSymbol>i.U.</printSymbol>
-      <property>arbitrary</property>
-      <value Unit="[iU]" UNIT="[IU]" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[arb'U]" CODE="[ARB'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>arbitary unit</name>
-      <printSymbol>arb. U</printSymbol>
-      <property>arbitrary</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[USP'U]" CODE="[USP'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>United States Pharmacopeia unit</name>
-      <printSymbol>U.S.P.</printSymbol>
-      <property>arbitrary</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[GPL'U]" CODE="[GPL'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>GPL unit</name>
-      <property>biologic activity of anticardiolipin IgG</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[MPL'U]" CODE="[MPL'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>MPL unit</name>
-      <property>biologic activity of anticardiolipin IgM</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[APL'U]" CODE="[APL'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>APL unit</name>
-      <property>biologic activity of anticardiolipin IgA</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[beth'U]" CODE="[BETH'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>Bethesda unit</name>
-      <property>biologic activity of factor VIII inhibitor</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[anti'Xa'U]" CODE="[ANTI'XA'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>anti factor Xa unit</name>
-      <property>biologic activity of factor Xa inhibitor (heparin)</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[todd'U]" CODE="[TODD'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>Todd unit</name>
-      <property>biologic activity antistreptolysin O</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[dye'U]" CODE="[DYE'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>Dye unit</name>
-      <property>biologic activity of amylase</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[smgy'U]" CODE="[SMGY'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>Somogyi unit</name>
-      <property>biologic activity of amylase</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[bdsk'U]" CODE="[BDSK'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>Bodansky unit</name>
-      <property>biologic activity of phosphatase</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[ka'U]" CODE="[KA'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>King-Armstrong unit</name>
-      <property>biologic activity of phosphatase</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[knk'U]" CODE="[KNK'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>Kunkel unit</name>
-      <property>arbitrary biologic activity</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[mclg'U]" CODE="[MCLG'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>Mac Lagan unit</name>
-      <property>arbitrary biologic activity</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[tb'U]" CODE="[TB'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>tuberculin unit</name>
-      <property>biologic activity of tuberculin</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[CCID_50]" CODE="[CCID_50]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>50% cell culture infectious dose</name>
-      <printSymbol>CCID<sub>50</sub>
-      </printSymbol>
-      <property>biologic activity (infectivity) of an infectious agent preparation</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[TCID_50]" CODE="[TCID_50]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>50% tissue culture infectious dose</name>
-      <printSymbol>TCID<sub>50</sub>
-      </printSymbol>
-      <property>biologic activity (infectivity) of an infectious agent preparation</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[EID_50]" CODE="[EID_50]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>50% embryo infectious dose</name>
-      <printSymbol>EID<sub>50</sub>
-      </printSymbol>
-      <property>biologic activity (infectivity) of an infectious agent preparation</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[PFU]" CODE="[PFU]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>plaque forming units</name>
-      <printSymbol>PFU</printSymbol>
-      <property>amount of an infectious agent</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[FFU]" CODE="[FFU]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>focus forming units</name>
-      <printSymbol>FFU</printSymbol>
-      <property>amount of an infectious agent</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[CFU]" CODE="[CFU]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>colony forming units</name>
-      <printSymbol>CFU</printSymbol>
-      <property>amount of a proliferating organism</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[BAU]" CODE="[BAU]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>bioequivalent allergen unit</name>
-      <printSymbol>BAU</printSymbol>
-      <property>amount of an allergen callibrated through in-vivo testing based on the ID50EAL method of (intradermal dilution for 50mm sum of erythema diameters</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[AU]" CODE="[AU]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>allergen unit</name>
-      <printSymbol>AU</printSymbol>
-      <property>procedure defined amount of an allergen using some reference standard</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[Amb'a'1'U]" CODE="[AMB'A'1'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>allergen unit for Ambrosia artemisiifolia</name>
-      <printSymbol>Amb a 1 U</printSymbol>
-      <property>procedure defined amount of the major allergen of ragweed.</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[PNU]" CODE="[PNU]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>protein nitrogen unit</name>
-      <printSymbol>PNU</printSymbol>
-      <property>procedure defined amount of a protein substance</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[Lf]" CODE="[LF]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>Limit of flocculation</name>
-      <printSymbol>Lf</printSymbol>
-      <property>procedure defined amount of an antigen substance</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[D'ag'U]" CODE="[D'AG'U]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>D-antigen unit</name>
-      <printSymbol/>
-      <property>procedure defined amount of a poliomyelitis d-antigen substance</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[FEU]" CODE="[FEU]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>fibrinogen equivalent unit</name>
-      <printSymbol/>
-      <property>amount of fibrinogen broken down into the measured d-dimers</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[ELU]" CODE="[ELU]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>ELISA unit</name>
-      <printSymbol/>
-      <property>arbitrary ELISA unit</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[EU]" CODE="[EU]" isMetric="no" isArbitrary="yes"
-         class="chemical">
-      <name>Ehrlich unit</name>
-      <printSymbol/>
-      <property>Ehrlich unit</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Np" CODE="NEP" isMetric="yes" isSpecial="yes" class="levels">
-      <name>neper</name>
-      <printSymbol>Np</printSymbol>
-      <property>level</property>
-      <value Unit="ln(1 1)" UNIT="LN(1 1)">
-         <function name="ln" value="1" Unit="1"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="B" CODE="B" isMetric="yes" isSpecial="yes" class="levels">
-      <name>bel</name>
-      <printSymbol>B</printSymbol>
-      <property>level</property>
-      <value Unit="lg(1 1)" UNIT="LG(1 1)">
-         <function name="lg" value="1" Unit="1"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="B[SPL]" CODE="B[SPL]" isMetric="yes" isSpecial="yes"
-         class="levels">
-      <name>bel sound pressure</name>
-      <printSymbol>B(SPL)</printSymbol>
-      <property>pressure level</property>
-      <value Unit="2lg(2 10*-5.Pa)" UNIT="2LG(2 10*-5.PAL)">
-         <function name="lgTimes2" value="2" Unit="10*-5.Pa"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="B[V]" CODE="B[V]" isMetric="yes" isSpecial="yes" class="levels">
-      <name>bel volt</name>
-      <printSymbol>B(V)</printSymbol>
-      <property>electric potential level</property>
-      <value Unit="2lg(1 V)" UNIT="2LG(1 V)">
-         <function name="lgTimes2" value="1" Unit="V"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="B[mV]" CODE="B[MV]" isMetric="yes" isSpecial="yes" class="levels">
-      <name>bel millivolt</name>
-      <printSymbol>B(mV)</printSymbol>
-      <property>electric potential level</property>
-      <value Unit="2lg(1 mV)" UNIT="2LG(1 MV)">
-         <function name="lgTimes2" value="1" Unit="mV"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="B[uV]" CODE="B[UV]" isMetric="yes" isSpecial="yes" class="levels">
-      <name>bel microvolt</name>
-      <printSymbol>B(&#956;V)</printSymbol>
-      <property>electric potential level</property>
-      <value Unit="2lg(1 uV)" UNIT="2LG(1 UV)">
-         <function name="lgTimes2" value="1" Unit="uV"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="B[10.nV]" CODE="B[10.NV]" isMetric="yes" isSpecial="yes"
-         class="levels">
-      <name>bel 10 nanovolt</name>
-      <printSymbol>B(10 nV)</printSymbol>
-      <property>electric potential level</property>
-      <value Unit="2lg(10 nV)" UNIT="2LG(10 NV)">
-         <function name="lgTimes2" value="10" Unit="nV"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="B[W]" CODE="B[W]" isMetric="yes" isSpecial="yes" class="levels">
-      <name>bel watt</name>
-      <printSymbol>B(W)</printSymbol>
-      <property>power level</property>
-      <value Unit="lg(1 W)" UNIT="LG(1 W)">
-         <function name="lg" value="1" Unit="W"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="B[kW]" CODE="B[KW]" isMetric="yes" isSpecial="yes" class="levels">
-      <name>bel kilowatt</name>
-      <printSymbol>B(kW)</printSymbol>
-      <property>power level</property>
-      <value Unit="lg(1 kW)" UNIT="LG(1 KW)">
-         <function name="lg" value="1" Unit="kW"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="st" CODE="STR" isMetric="yes" class="misc">
-      <name>stere</name>
-      <printSymbol>st</printSymbol>
-      <property>volume</property>
-      <value Unit="m3" UNIT="M3" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="Ao" CODE="AO" isMetric="no" class="misc">
-      <name>&#197;ngstr&#246;m</name>
-      <printSymbol>&#197;</printSymbol>
-      <property>length</property>
-      <value Unit="nm" UNIT="NM" value="0.1">0.1</value>
-   </unit>
-   <unit xmlns="" Code="b" CODE="BRN" isMetric="no" class="misc">
-      <name>barn</name>
-      <printSymbol>b</printSymbol>
-      <property>action area</property>
-      <value Unit="fm2" UNIT="FM2" value="100">100</value>
-   </unit>
-   <unit xmlns="" Code="att" CODE="ATT" isMetric="no" class="misc">
-      <name>technical atmosphere</name>
-      <printSymbol>at</printSymbol>
-      <property>pressure</property>
-      <value Unit="kgf/cm2" UNIT="KGF/CM2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="mho" CODE="MHO" isMetric="yes" class="misc">
-      <name>mho</name>
-      <printSymbol>mho</printSymbol>
-      <property>electric conductance</property>
-      <value Unit="S" UNIT="S" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[psi]" CODE="[PSI]" isMetric="no" class="misc">
-      <name>pound per sqare inch</name>
-      <printSymbol>psi</printSymbol>
-      <property>pressure</property>
-      <value Unit="[lbf_av]/[in_i]2" UNIT="[LBF_AV]/[IN_I]2" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="circ" CODE="CIRC" isMetric="no" class="misc">
-      <name>circle</name>
-      <printSymbol>circ</printSymbol>
-      <property>plane angle</property>
-      <value Unit="[pi].rad" UNIT="[PI].RAD" value="2">2</value>
-   </unit>
-   <unit xmlns="" Code="sph" CODE="SPH" isMetric="no" class="misc">
-      <name>spere</name>
-      <printSymbol>sph</printSymbol>
-      <property>solid angle</property>
-      <value Unit="[pi].sr" UNIT="[PI].SR" value="4">4</value>
-   </unit>
-   <unit xmlns="" Code="[car_m]" CODE="[CAR_M]" isMetric="no" class="misc">
-      <name>metric carat</name>
-      <printSymbol>ct<sub>m</sub>
-      </printSymbol>
-      <property>mass</property>
-      <value Unit="g" UNIT="G" value="2e-1">0.2</value>
-   </unit>
-   <unit xmlns="" Code="[car_Au]" CODE="[CAR_AU]" isMetric="no" class="misc">
-      <name>carat of gold alloys</name>
-      <printSymbol>ct<sub>
-            <r>Au</r>
-         </sub>
-      </printSymbol>
-      <property>mass fraction</property>
-      <value Unit="/24" UNIT="/24" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="[smoot]" CODE="[SMOOT]" isMetric="no" class="misc">
-      <name>Smoot</name>
-      <printSymbol/>
-      <property>length</property>
-      <value Unit="[in_i]" UNIT="[IN_I]" value="67">67</value>
-   </unit>
-   <unit xmlns="" Code="bit_s" CODE="BIT_S" isMetric="no" isSpecial="yes"
-         class="infotech">
-      <name>bit</name>
-      <printSymbol>bit<sub>s</sub>
-      </printSymbol>
-      <property>amount of information</property>
-      <value Unit="ld(1 1)" UNIT="ld(1 1)">
-         <function name="ld" value="1" Unit="1"/>
-      </value>
-   </unit>
-   <unit xmlns="" Code="bit" CODE="BIT" isMetric="yes" class="infotech">
-      <name>bit</name>
-      <printSymbol>bit</printSymbol>
-      <property>amount of information</property>
-      <value Unit="1" UNIT="1" value="1">1</value>
-   </unit>
-   <unit xmlns="" Code="By" CODE="BY" isMetric="yes" class="infotech">
-      <name>byte</name>
-      <printSymbol>B</printSymbol>
-      <property>amount of information</property>
-      <value Unit="bit" UNIT="bit" value="8">8</value>
-   </unit>
-   <unit xmlns="" Code="Bd" CODE="BD" isMetric="yes" class="infotech">
-      <name>baud</name>
-      <printSymbol>Bd</printSymbol>
-      <property>signal transmission rate</property>
-      <value Unit="/s" UNIT="/s" value="1">1</value>
-   </unit>
-   <prefix xmlns="" Code="Ki" CODE="KIB">
-      <name>kibi</name>
-      <printSymbol>Ki</printSymbol>
-      <value value="1024">1024</value>
-   </prefix>
-   <prefix xmlns="" Code="Mi" CODE="MIB">
-      <name>mebi</name>
-      <printSymbol>Mi</printSymbol>
-      <value value="1048576">1048576</value>
-   </prefix>
-   <prefix xmlns="" Code="Gi" CODE="GIB">
-      <name>gibi</name>
-      <printSymbol>Gi</printSymbol>
-      <value value="1073741824">1073741824</value>
-   </prefix>
-   <prefix xmlns="" Code="Ti" CODE="TIB">
-      <name>tebi</name>
-      <printSymbol>Ti</printSymbol>
-      <value value="1099511627776">1099511627776</value>
-   </prefix>
+<?xml version="1.0" encoding="ascii"?>
+<root xmlns="http://unitsofmeasure.org/ucum-essence" version="1.9"
+      revision="$Revision: 16410 $"
+      revision-date="$Date: 2013-10-21 21:24:43 -0700 (Mon, 21 Oct 2013) $">
+   <prefix xmlns="" Code="Y" CODE="YA">
+      <name>yotta</name>
+      <printSymbol>Y</printSymbol>
+      <value value="1e24">1 &#215; 10<sup>24</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="Z" CODE="ZA">
+      <name>zetta</name>
+      <printSymbol>Z</printSymbol>
+      <value value="1e21">1 &#215; 10<sup>21</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="E" CODE="EX">
+      <name>exa</name>
+      <printSymbol>E</printSymbol>
+      <value value="1e18">1 &#215; 10<sup>18</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="P" CODE="PT">
+      <name>peta</name>
+      <printSymbol>P</printSymbol>
+      <value value="1e15">1 &#215; 10<sup>15</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="T" CODE="TR">
+      <name>tera</name>
+      <printSymbol>T</printSymbol>
+      <value value="1e12">1 &#215; 10<sup>12</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="G" CODE="GA">
+      <name>giga</name>
+      <printSymbol>G</printSymbol>
+      <value value="1e9">1 &#215; 10<sup>9</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="M" CODE="MA">
+      <name>mega</name>
+      <printSymbol>M</printSymbol>
+      <value value="1e6">1 &#215; 10<sup>6</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="k" CODE="K">
+      <name>kilo</name>
+      <printSymbol>k</printSymbol>
+      <value value="1e3">1 &#215; 10<sup>3</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="h" CODE="H">
+      <name>hecto</name>
+      <printSymbol>h</printSymbol>
+      <value value="1e2">1 &#215; 10<sup>2</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="da" CODE="DA">
+      <name>deka</name>
+      <printSymbol>da</printSymbol>
+      <value value="1e1">1 &#215; 10<sup>1</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="d" CODE="D">
+      <name>deci</name>
+      <printSymbol>d</printSymbol>
+      <value value="1e-1">1 &#215; 10<sup>-1</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="c" CODE="C">
+      <name>centi</name>
+      <printSymbol>c</printSymbol>
+      <value value="1e-2">1 &#215; 10<sup>-2</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="m" CODE="M">
+      <name>milli</name>
+      <printSymbol>m</printSymbol>
+      <value value="1e-3">1 &#215; 10<sup>-3</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="u" CODE="U">
+      <name>micro</name>
+      <printSymbol>&#956;</printSymbol>
+      <value value="1e-6">1 &#215; 10<sup>-6</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="n" CODE="N">
+      <name>nano</name>
+      <printSymbol>n</printSymbol>
+      <value value="1e-9">1 &#215; 10<sup>-9</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="p" CODE="P">
+      <name>pico</name>
+      <printSymbol>p</printSymbol>
+      <value value="1e-12">1 &#215; 10<sup>-12</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="f" CODE="F">
+      <name>femto</name>
+      <printSymbol>f</printSymbol>
+      <value value="1e-15">1 &#215; 10<sup>-15</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="a" CODE="A">
+      <name>atto</name>
+      <printSymbol>a</printSymbol>
+      <value value="1e-18">1 &#215; 10<sup>-18</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="z" CODE="ZO">
+      <name>zepto</name>
+      <printSymbol>z</printSymbol>
+      <value value="1e-21">1 &#215; 10<sup>-21</sup>
+      </value>
+   </prefix>
+   <prefix xmlns="" Code="y" CODE="YO">
+      <name>yocto</name>
+      <printSymbol>y</printSymbol>
+      <value value="1e-24">1 &#215; 10<sup>-24</sup>
+      </value>
+   </prefix>
+   <base-unit xmlns="" Code="m" CODE="M" dim="L">
+      <name>meter</name>
+      <printSymbol>m</printSymbol>
+      <property>length</property>
+   </base-unit>
+   <base-unit xmlns="" Code="s" CODE="S" dim="T">
+      <name>second</name>
+      <printSymbol>s</printSymbol>
+      <property>time</property>
+   </base-unit>
+   <base-unit xmlns="" Code="g" CODE="G" dim="M">
+      <name>gram</name>
+      <printSymbol>g</printSymbol>
+      <property>mass</property>
+   </base-unit>
+   <base-unit xmlns="" Code="rad" CODE="RAD" dim="A">
+      <name>radian</name>
+      <printSymbol>rad</printSymbol>
+      <property>plane angle</property>
+   </base-unit>
+   <base-unit xmlns="" Code="K" CODE="K" dim="C">
+      <name>Kelvin</name>
+      <printSymbol>K</printSymbol>
+      <property>temperature</property>
+   </base-unit>
+   <base-unit xmlns="" Code="C" CODE="C" dim="Q">
+      <name>Coulomb</name>
+      <printSymbol>C</printSymbol>
+      <property>electric charge</property>
+   </base-unit>
+   <base-unit xmlns="" Code="cd" CODE="CD" dim="F">
+      <name>candela</name>
+      <printSymbol>cd</printSymbol>
+      <property>luminous intensity</property>
+   </base-unit>
+   <unit xmlns="" Code="10*" CODE="10*" isMetric="no" class="dimless">
+      <name>the number ten for arbitrary powers</name>
+      <printSymbol>10</printSymbol>
+      <property>number</property>
+      <value Unit="1" UNIT="1" value="10">10</value>
+   </unit>
+   <unit xmlns="" Code="10^" CODE="10^" isMetric="no" class="dimless">
+      <name>the number ten for arbitrary powers</name>
+      <printSymbol>10</printSymbol>
+      <property>number</property>
+      <value Unit="1" UNIT="1" value="10">10</value>
+   </unit>
+   <unit xmlns="" Code="[pi]" CODE="[PI]" isMetric="no" class="dimless">
+      <name>the number pi</name>
+      <printSymbol>&#960;</printSymbol>
+      <property>number</property>
+      <value Unit="1" UNIT="1"
+             value="3.1415926535897932384626433832795028841971693993751058209749445923">&#960;</value>
+   </unit>
+   <unit xmlns="" Code="%" CODE="%" isMetric="no" class="dimless">
+      <name>percent</name>
+      <printSymbol>%</printSymbol>
+      <property>fraction</property>
+      <value Unit="10*-2" UNIT="10*-2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[ppth]" CODE="[PPTH]" isMetric="no" class="dimless">
+      <name>parts per thousand</name>
+      <printSymbol>ppth</printSymbol>
+      <property>fraction</property>
+      <value Unit="10*-3" UNIT="10*-3" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[ppm]" CODE="[PPM]" isMetric="no" class="dimless">
+      <name>parts per million</name>
+      <printSymbol>ppm</printSymbol>
+      <property>fraction</property>
+      <value Unit="10*-6" UNIT="10*-6" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[ppb]" CODE="[PPB]" isMetric="no" class="dimless">
+      <name>parts per billion</name>
+      <printSymbol>ppb</printSymbol>
+      <property>fraction</property>
+      <value Unit="10*-9" UNIT="10*-9" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[pptr]" CODE="[PPTR]" isMetric="no" class="dimless">
+      <name>parts per trillion</name>
+      <printSymbol>pptr</printSymbol>
+      <property>fraction</property>
+      <value Unit="10*-12" UNIT="10*-12" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="mol" CODE="MOL" isMetric="yes" class="si">
+      <name>mole</name>
+      <printSymbol>mol</printSymbol>
+      <property>amount of substance</property>
+      <value Unit="10*23" UNIT="10*23" value="6.0221367">6.0221367</value>
+   </unit>
+   <unit xmlns="" Code="sr" CODE="SR" isMetric="yes" class="si">
+      <name>steradian</name>
+      <printSymbol>sr</printSymbol>
+      <property>solid angle</property>
+      <value Unit="rad2" UNIT="RAD2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Hz" CODE="HZ" isMetric="yes" class="si">
+      <name>Hertz</name>
+      <printSymbol>Hz</printSymbol>
+      <property>frequency</property>
+      <value Unit="s-1" UNIT="S-1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="N" CODE="N" isMetric="yes" class="si">
+      <name>Newton</name>
+      <printSymbol>N</printSymbol>
+      <property>force</property>
+      <value Unit="kg.m/s2" UNIT="KG.M/S2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Pa" CODE="PAL" isMetric="yes" class="si">
+      <name>Pascal</name>
+      <printSymbol>Pa</printSymbol>
+      <property>pressure</property>
+      <value Unit="N/m2" UNIT="N/M2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="J" CODE="J" isMetric="yes" class="si">
+      <name>Joule</name>
+      <printSymbol>J</printSymbol>
+      <property>energy</property>
+      <value Unit="N.m" UNIT="N.M" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="W" CODE="W" isMetric="yes" class="si">
+      <name>Watt</name>
+      <printSymbol>W</printSymbol>
+      <property>power</property>
+      <value Unit="J/s" UNIT="J/S" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="A" CODE="A" isMetric="yes" class="si">
+      <name>Amp&#232;re</name>
+      <printSymbol>A</printSymbol>
+      <property>electric current</property>
+      <value Unit="C/s" UNIT="C/S" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="V" CODE="V" isMetric="yes" class="si">
+      <name>Volt</name>
+      <printSymbol>V</printSymbol>
+      <property>electric potential</property>
+      <value Unit="J/C" UNIT="J/C" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="F" CODE="F" isMetric="yes" class="si">
+      <name>Farad</name>
+      <printSymbol>F</printSymbol>
+      <property>electric capacitance</property>
+      <value Unit="C/V" UNIT="C/V" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Ohm" CODE="OHM" isMetric="yes" class="si">
+      <name>Ohm</name>
+      <printSymbol>&#937;</printSymbol>
+      <property>electric resistance</property>
+      <value Unit="V/A" UNIT="V/A" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="S" CODE="SIE" isMetric="yes" class="si">
+      <name>Siemens</name>
+      <printSymbol>S</printSymbol>
+      <property>electric conductance</property>
+      <value Unit="Ohm-1" UNIT="OHM-1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Wb" CODE="WB" isMetric="yes" class="si">
+      <name>Weber</name>
+      <printSymbol>Wb</printSymbol>
+      <property>magentic flux</property>
+      <value Unit="V.s" UNIT="V.S" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Cel" CODE="CEL" isMetric="yes" isSpecial="yes" class="si">
+      <name>degree Celsius</name>
+      <printSymbol>&#176;C</printSymbol>
+      <property>temperature</property>
+      <value Unit="cel(1 K)" UNIT="CEL(1 K)">
+         <function name="Cel" value="1" Unit="K"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="T" CODE="T" isMetric="yes" class="si">
+      <name>Tesla</name>
+      <printSymbol>T</printSymbol>
+      <property>magnetic flux density</property>
+      <value Unit="Wb/m2" UNIT="WB/M2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="H" CODE="H" isMetric="yes" class="si">
+      <name>Henry</name>
+      <printSymbol>H</printSymbol>
+      <property>inductance</property>
+      <value Unit="Wb/A" UNIT="WB/A" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="lm" CODE="LM" isMetric="yes" class="si">
+      <name>lumen</name>
+      <printSymbol>lm</printSymbol>
+      <property>luminous flux</property>
+      <value Unit="cd.sr" UNIT="CD.SR" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="lx" CODE="LX" isMetric="yes" class="si">
+      <name>lux</name>
+      <printSymbol>lx</printSymbol>
+      <property>illuminance</property>
+      <value Unit="lm/m2" UNIT="LM/M2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Bq" CODE="BQ" isMetric="yes" class="si">
+      <name>Becquerel</name>
+      <printSymbol>Bq</printSymbol>
+      <property>radioactivity</property>
+      <value Unit="s-1" UNIT="S-1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Gy" CODE="GY" isMetric="yes" class="si">
+      <name>Gray</name>
+      <printSymbol>Gy</printSymbol>
+      <property>energy dose</property>
+      <value Unit="J/kg" UNIT="J/KG" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Sv" CODE="SV" isMetric="yes" class="si">
+      <name>Sievert</name>
+      <printSymbol>Sv</printSymbol>
+      <property>dose equivalent</property>
+      <value Unit="J/kg" UNIT="J/KG" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="gon" CODE="GON" isMetric="no" class="iso1000">
+      <name>gon</name>
+      <name>grade</name>
+      <printSymbol>&#9633;<sup>g</sup>
+      </printSymbol>
+      <property>plane angle</property>
+      <value Unit="deg" UNIT="DEG" value="0.9">0.9</value>
+   </unit>
+   <unit xmlns="" Code="deg" CODE="DEG" isMetric="no" class="iso1000">
+      <name>degree</name>
+      <printSymbol>&#176;</printSymbol>
+      <property>plane angle</property>
+      <value Unit="[pi].rad/360" UNIT="[PI].RAD/360" value="2">2</value>
+   </unit>
+   <unit xmlns="" Code="'" CODE="'" isMetric="no" class="iso1000">
+      <name>minute</name>
+      <printSymbol>'</printSymbol>
+      <property>plane angle</property>
+      <value Unit="deg/60" UNIT="DEG/60" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="''" CODE="''" isMetric="no" class="iso1000">
+      <name>second</name>
+      <printSymbol>''</printSymbol>
+      <property>plane angle</property>
+      <value Unit="'/60" UNIT="'/60" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="l" CODE="L" isMetric="yes" class="iso1000">
+      <name>liter</name>
+      <printSymbol>l</printSymbol>
+      <property>volume</property>
+      <value Unit="dm3" UNIT="DM3" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="L" isMetric="yes" class="iso1000">
+      <name>liter</name>
+      <printSymbol>L</printSymbol>
+      <property>volume</property>
+      <value Unit="l" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="ar" CODE="AR" isMetric="yes" class="iso1000">
+      <name>are</name>
+      <printSymbol>a</printSymbol>
+      <property>area</property>
+      <value Unit="m2" UNIT="M2" value="100">100</value>
+   </unit>
+   <unit xmlns="" Code="min" CODE="MIN" isMetric="no" class="iso1000">
+      <name>minute</name>
+      <printSymbol>min</printSymbol>
+      <property>time</property>
+      <value Unit="s" UNIT="S" value="60">60</value>
+   </unit>
+   <unit xmlns="" Code="h" CODE="HR" isMetric="no" class="iso1000">
+      <name>hour</name>
+      <printSymbol>h</printSymbol>
+      <property>time</property>
+      <value Unit="min" UNIT="MIN" value="60">60</value>
+   </unit>
+   <unit xmlns="" Code="d" CODE="D" isMetric="no" class="iso1000">
+      <name>day</name>
+      <printSymbol>d</printSymbol>
+      <property>time</property>
+      <value Unit="h" UNIT="HR" value="24">24</value>
+   </unit>
+   <unit xmlns="" Code="a_t" CODE="ANN_T" isMetric="no" class="iso1000">
+      <name>tropical year</name>
+      <printSymbol>a<sub>t</sub>
+      </printSymbol>
+      <property>time</property>
+      <value Unit="d" UNIT="D" value="365.24219">365.24219</value>
+   </unit>
+   <unit xmlns="" Code="a_j" CODE="ANN_J" isMetric="no" class="iso1000">
+      <name>mean Julian year</name>
+      <printSymbol>a<sub>j</sub>
+      </printSymbol>
+      <property>time</property>
+      <value Unit="d" UNIT="D" value="365.25">365.25</value>
+   </unit>
+   <unit xmlns="" Code="a_g" CODE="ANN_G" isMetric="no" class="iso1000">
+      <name>mean Gregorian year</name>
+      <printSymbol>a<sub>g</sub>
+      </printSymbol>
+      <property>time</property>
+      <value Unit="d" UNIT="D" value="365.2425">365.2425</value>
+   </unit>
+   <unit xmlns="" Code="a" CODE="ANN" isMetric="no" class="iso1000">
+      <name>year</name>
+      <printSymbol>a</printSymbol>
+      <property>time</property>
+      <value Unit="a_j" UNIT="ANN_J" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="wk" CODE="WK" isMetric="no" class="iso1000">
+      <name>week</name>
+      <printSymbol>wk</printSymbol>
+      <property>time</property>
+      <value Unit="d" UNIT="D" value="7">7</value>
+   </unit>
+   <unit xmlns="" Code="mo_s" CODE="MO_S" isMetric="no" class="iso1000">
+      <name>synodal month</name>
+      <printSymbol>mo<sub>s</sub>
+      </printSymbol>
+      <property>time</property>
+      <value Unit="d" UNIT="D" value="29.53059">29.53059</value>
+   </unit>
+   <unit xmlns="" Code="mo_j" CODE="MO_J" isMetric="no" class="iso1000">
+      <name>mean Julian month</name>
+      <printSymbol>mo<sub>j</sub>
+      </printSymbol>
+      <property>time</property>
+      <value Unit="a_j/12" UNIT="ANN_J/12" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="mo_g" CODE="MO_G" isMetric="no" class="iso1000">
+      <name>mean Gregorian month</name>
+      <printSymbol>mo<sub>g</sub>
+      </printSymbol>
+      <property>time</property>
+      <value Unit="a_g/12" UNIT="ANN_G/12" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="mo" CODE="MO" isMetric="no" class="iso1000">
+      <name>month</name>
+      <printSymbol>mo</printSymbol>
+      <property>time</property>
+      <value Unit="mo_j" UNIT="MO_J" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="t" CODE="TNE" isMetric="yes" class="iso1000">
+      <name>tonne</name>
+      <printSymbol>t</printSymbol>
+      <property>mass</property>
+      <value Unit="kg" UNIT="KG" value="1e3">1 &#215; 10<sup>3</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="bar" CODE="BAR" isMetric="yes" class="iso1000">
+      <name>bar</name>
+      <printSymbol>bar</printSymbol>
+      <property>pressure</property>
+      <value Unit="Pa" UNIT="PAL" value="1e5">1 &#215; 10<sup>5</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="u" CODE="AMU" isMetric="yes" class="iso1000">
+      <name>unified atomic mass unit</name>
+      <printSymbol>u</printSymbol>
+      <property>mass</property>
+      <value Unit="g" UNIT="G" value="1.6605402e-24">1.6605402 &#215; 10<sup>-24</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="eV" CODE="EV" isMetric="yes" class="iso1000">
+      <name>electronvolt</name>
+      <printSymbol>eV</printSymbol>
+      <property>energy</property>
+      <value Unit="[e].V" UNIT="[E].V" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="AU" CODE="ASU" isMetric="no" class="iso1000">
+      <name>astronomic unit</name>
+      <printSymbol>AU</printSymbol>
+      <property>length</property>
+      <value Unit="Mm" UNIT="MAM" value="149597.870691">149597.870691</value>
+   </unit>
+   <unit xmlns="" Code="pc" CODE="PRS" isMetric="yes" class="iso1000">
+      <name>parsec</name>
+      <printSymbol>pc</printSymbol>
+      <property>length</property>
+      <value Unit="m" UNIT="M" value="3.085678e16">3.085678 &#215; 10<sup>16</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[c]" CODE="[C]" isMetric="yes" class="const">
+      <name>velocity of light</name>
+      <printSymbol>
+         <i>c</i>
+      </printSymbol>
+      <property>velocity</property>
+      <value Unit="m/s" UNIT="M/S" value="299792458">299792458</value>
+   </unit>
+   <unit xmlns="" Code="[h]" CODE="[H]" isMetric="yes" class="const">
+      <name>Planck constant</name>
+      <printSymbol>
+         <i>h</i>
+      </printSymbol>
+      <property>action</property>
+      <value Unit="J.s" UNIT="J.S" value="6.6260755e-24">6.6260755 &#215; 10<sup>-24</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[k]" CODE="[K]" isMetric="yes" class="const">
+      <name>Boltzmann constant</name>
+      <printSymbol>
+         <i>k</i>
+      </printSymbol>
+      <property>(unclassified)</property>
+      <value Unit="J/K" UNIT="J/K" value="1.380658e-23">1.380658 &#215; 10<sup>-23</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[eps_0]" CODE="[EPS_0]" isMetric="yes" class="const">
+      <name>permittivity of vacuum</name>
+      <printSymbol>
+         <i>&#949;<sub>
+               <r>0</r>
+            </sub>
+         </i>
+      </printSymbol>
+      <property>electric permittivity</property>
+      <value Unit="F/m" UNIT="F/M" value="8.854187817e-12">8.854187817 &#215; 10<sup>-12</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[mu_0]" CODE="[MU_0]" isMetric="yes" class="const">
+      <name>permeability of vacuum</name>
+      <printSymbol>
+         <i>&#956;<sub>
+               <r>0</r>
+            </sub>
+         </i>
+      </printSymbol>
+      <property>magnetic permeability</property>
+      <value Unit="4.[pi].10*-7.N/A2" UNIT="4.[PI].10*-7.N/A2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[e]" CODE="[E]" isMetric="yes" class="const">
+      <name>elementary charge</name>
+      <printSymbol>
+         <i>e</i>
+      </printSymbol>
+      <property>electric charge</property>
+      <value Unit="C" UNIT="C" value="1.60217733e-19">1.60217733 &#215; 10<sup>-19</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[m_e]" CODE="[M_E]" isMetric="yes" class="const">
+      <name>electron mass</name>
+      <printSymbol>
+         <i>m<sub>
+               <r>e</r>
+            </sub>
+         </i>
+      </printSymbol>
+      <property>mass</property>
+      <value Unit="g" UNIT="g" value="9.1093897e-28">9.1093897 &#215; 10<sup>-28</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[m_p]" CODE="[M_P]" isMetric="yes" class="const">
+      <name>proton mass</name>
+      <printSymbol>
+         <i>m<sub>
+               <r>p</r>
+            </sub>
+         </i>
+      </printSymbol>
+      <property>mass</property>
+      <value Unit="g" UNIT="g" value="1.6726231e-24">1.6726231 &#215; 10<sup>-24</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[G]" CODE="[GC]" isMetric="yes" class="const">
+      <name>Newtonian constant of gravitation</name>
+      <printSymbol>
+         <i>G</i>
+      </printSymbol>
+      <property>(unclassified)</property>
+      <value Unit="m3.kg-1.s-2" UNIT="M3.KG-1.S-2" value="6.67259e-11">6.67259 &#215; 10<sup>-11</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[g]" CODE="[G]" isMetric="yes" class="const">
+      <name>standard acceleration of free fall</name>
+      <printSymbol>
+         <i>g<sub>n</sub>
+         </i>
+      </printSymbol>
+      <property>acceleration</property>
+      <value Unit="m/s2" UNIT="M/S2" value="980665e-5">9.80665</value>
+   </unit>
+   <unit xmlns="" Code="atm" CODE="ATM" isMetric="no" class="const">
+      <name>standard atmosphere</name>
+      <printSymbol>atm</printSymbol>
+      <property>pressure</property>
+      <value Unit="Pa" UNIT="PAL" value="101325">101325</value>
+   </unit>
+   <unit xmlns="" Code="[ly]" CODE="[LY]" isMetric="yes" class="const">
+      <name>light-year</name>
+      <printSymbol>l.y.</printSymbol>
+      <property>length</property>
+      <value Unit="[c].a_j" UNIT="[C].ANN_J" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="gf" CODE="GF" isMetric="yes" class="const">
+      <name>gram-force</name>
+      <printSymbol>gf</printSymbol>
+      <property>force</property>
+      <value Unit="g.[g]" UNIT="G.[G]" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[lbf_av]" CODE="[LBF_AV]" isMetric="no" class="const">
+      <name>pound force</name>
+      <printSymbol>lbf</printSymbol>
+      <property>force</property>
+      <value Unit="[lb_av].[g]" UNIT="[LB_AV].[G]" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Ky" CODE="KY" isMetric="yes" class="cgs">
+      <name>Kayser</name>
+      <printSymbol>K</printSymbol>
+      <property>lineic number</property>
+      <value Unit="cm-1" UNIT="CM-1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Gal" CODE="GL" isMetric="yes" class="cgs">
+      <name>Gal</name>
+      <printSymbol>Gal</printSymbol>
+      <property>acceleration</property>
+      <value Unit="cm/s2" UNIT="CM/S2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="dyn" CODE="DYN" isMetric="yes" class="cgs">
+      <name>dyne</name>
+      <printSymbol>dyn</printSymbol>
+      <property>force</property>
+      <value Unit="g.cm/s2" UNIT="G.CM/S2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="erg" CODE="ERG" isMetric="yes" class="cgs">
+      <name>erg</name>
+      <printSymbol>erg</printSymbol>
+      <property>energy</property>
+      <value Unit="dyn.cm" UNIT="DYN.CM" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="P" CODE="P" isMetric="yes" class="cgs">
+      <name>Poise</name>
+      <printSymbol>P</printSymbol>
+      <property>dynamic viscosity</property>
+      <value Unit="dyn.s/cm2" UNIT="DYN.S/CM2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Bi" CODE="BI" isMetric="yes" class="cgs">
+      <name>Biot</name>
+      <printSymbol>Bi</printSymbol>
+      <property>electric current</property>
+      <value Unit="A" UNIT="A" value="10">10</value>
+   </unit>
+   <unit xmlns="" Code="St" CODE="ST" isMetric="yes" class="cgs">
+      <name>Stokes</name>
+      <printSymbol>St</printSymbol>
+      <property>kinematic viscosity</property>
+      <value Unit="cm2/s" UNIT="CM2/S" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Mx" CODE="MX" isMetric="yes" class="cgs">
+      <name>Maxwell</name>
+      <printSymbol>Mx</printSymbol>
+      <property>flux of magnetic induction</property>
+      <value Unit="Wb" UNIT="WB" value="1e-8">1 &#215; 10<sup>-8</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="G" CODE="GS" isMetric="yes" class="cgs">
+      <name>Gauss</name>
+      <printSymbol>Gs</printSymbol>
+      <property>magnetic flux density</property>
+      <value Unit="T" UNIT="T" value="1e-4">1 &#215; 10<sup>-4</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="Oe" CODE="OE" isMetric="yes" class="cgs">
+      <name>Oersted</name>
+      <printSymbol>Oe</printSymbol>
+      <property>magnetic field intensity</property>
+      <value Unit="/[pi].A/m" UNIT="/[PI].A/M" value="250">250</value>
+   </unit>
+   <unit xmlns="" Code="Gb" CODE="GB" isMetric="yes" class="cgs">
+      <name>Gilbert</name>
+      <printSymbol>Gb</printSymbol>
+      <property>magnetic tension</property>
+      <value Unit="Oe.cm" UNIT="OE.CM" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="sb" CODE="SB" isMetric="yes" class="cgs">
+      <name>stilb</name>
+      <printSymbol>sb</printSymbol>
+      <property>lum. intensity density</property>
+      <value Unit="cd/cm2" UNIT="CD/CM2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Lmb" CODE="LMB" isMetric="yes" class="cgs">
+      <name>Lambert</name>
+      <printSymbol>L</printSymbol>
+      <property>brightness</property>
+      <value Unit="cd/cm2/[pi]" UNIT="CD/CM2/[PI]" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="ph" CODE="PHT" isMetric="yes" class="cgs">
+      <name>phot</name>
+      <printSymbol>ph</printSymbol>
+      <property>illuminance</property>
+      <value Unit="lx" UNIT="LX" value="1e-4">1 &#215; 10<sup>-4</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="Ci" CODE="CI" isMetric="yes" class="cgs">
+      <name>Curie</name>
+      <printSymbol>Ci</printSymbol>
+      <property>radioactivity</property>
+      <value Unit="Bq" UNIT="BQ" value="37e9">3.7 &#215; 10<sup>10</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="R" CODE="ROE" isMetric="yes" class="cgs">
+      <name>Roentgen</name>
+      <printSymbol>R</printSymbol>
+      <property>ion dose</property>
+      <value Unit="C/kg" UNIT="C/KG" value="2.58e-4">2.58 &#215; 10<sup>-4</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="RAD" CODE="[RAD]" isMetric="yes" class="cgs">
+      <name>radiation absorbed dose</name>
+      <printSymbol>RAD</printSymbol>
+      <property>energy dose</property>
+      <value Unit="erg/g" UNIT="ERG/G" value="100">100</value>
+   </unit>
+   <unit xmlns="" Code="REM" CODE="[REM]" isMetric="yes" class="cgs">
+      <name>radiation equivalent man</name>
+      <printSymbol>REM</printSymbol>
+      <property>dose equivalent</property>
+      <value Unit="RAD" UNIT="[RAD]" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[in_i]" CODE="[IN_I]" isMetric="no" class="intcust">
+      <name>inch</name>
+      <printSymbol>in</printSymbol>
+      <property>length</property>
+      <value Unit="cm" UNIT="CM" value="254e-2">2.54</value>
+   </unit>
+   <unit xmlns="" Code="[ft_i]" CODE="[FT_I]" isMetric="no" class="intcust">
+      <name>foot</name>
+      <printSymbol>ft</printSymbol>
+      <property>length</property>
+      <value Unit="[in_i]" UNIT="[IN_I]" value="12">12</value>
+   </unit>
+   <unit xmlns="" Code="[yd_i]" CODE="[YD_I]" isMetric="no" class="intcust">
+      <name>yard</name>
+      <printSymbol>yd</printSymbol>
+      <property>length</property>
+      <value Unit="[ft_i]" UNIT="[FT_I]" value="3">3</value>
+   </unit>
+   <unit xmlns="" Code="[mi_i]" CODE="[MI_I]" isMetric="no" class="intcust">
+      <name>statute mile</name>
+      <printSymbol>mi</printSymbol>
+      <property>length</property>
+      <value Unit="[ft_i]" UNIT="[FT_I]" value="5280">5280</value>
+   </unit>
+   <unit xmlns="" Code="[fth_i]" CODE="[FTH_I]" isMetric="no" class="intcust">
+      <name>fathom</name>
+      <printSymbol>fth</printSymbol>
+      <property>depth of water</property>
+      <value Unit="[ft_i]" UNIT="[FT_I]" value="6">6</value>
+   </unit>
+   <unit xmlns="" Code="[nmi_i]" CODE="[NMI_I]" isMetric="no" class="intcust">
+      <name>nautical mile</name>
+      <printSymbol>n.mi</printSymbol>
+      <property>length</property>
+      <value Unit="m" UNIT="M" value="1852">1852</value>
+   </unit>
+   <unit xmlns="" Code="[kn_i]" CODE="[KN_I]" isMetric="no" class="intcust">
+      <name>knot</name>
+      <printSymbol>knot</printSymbol>
+      <property>velocity</property>
+      <value Unit="[nmi_i]/h" UNIT="[NMI_I]/H" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[sin_i]" CODE="[SIN_I]" isMetric="no" class="intcust">
+      <name>square inch</name>
+      <property>area</property>
+      <value Unit="[in_i]2" UNIT="[IN_I]2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[sft_i]" CODE="[SFT_I]" isMetric="no" class="intcust">
+      <name>square foot</name>
+      <property>area</property>
+      <value Unit="[ft_i]2" UNIT="[FT_I]2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[syd_i]" CODE="[SYD_I]" isMetric="no" class="intcust">
+      <name>square yard</name>
+      <property>area</property>
+      <value Unit="[yd_i]2" UNIT="[YD_I]2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[cin_i]" CODE="[CIN_I]" isMetric="no" class="intcust">
+      <name>cubic inch</name>
+      <property>volume</property>
+      <value Unit="[in_i]3" UNIT="[IN_I]3" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[cft_i]" CODE="[CFT_I]" isMetric="no" class="intcust">
+      <name>cubic foot</name>
+      <property>volume</property>
+      <value Unit="[ft_i]3" UNIT="[FT_I]3" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[cyd_i]" CODE="[CYD_I]" isMetric="no" class="intcust">
+      <name>cubic yard</name>
+      <printSymbol>cu.yd</printSymbol>
+      <property>volume</property>
+      <value Unit="[yd_i]3" UNIT="[YD_I]3" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[bf_i]" CODE="[BF_I]" isMetric="no" class="intcust">
+      <name>board foot</name>
+      <property>volume</property>
+      <value Unit="[in_i]3" UNIT="[IN_I]3" value="144">144</value>
+   </unit>
+   <unit xmlns="" Code="[cr_i]" CODE="[CR_I]" isMetric="no" class="intcust">
+      <name>cord</name>
+      <property>volume</property>
+      <value Unit="[ft_i]3" UNIT="[FT_I]3" value="128">128</value>
+   </unit>
+   <unit xmlns="" Code="[mil_i]" CODE="[MIL_I]" isMetric="no" class="intcust">
+      <name>mil</name>
+      <printSymbol>mil</printSymbol>
+      <property>length</property>
+      <value Unit="[in_i]" UNIT="[IN_I]" value="1e-3">1 &#215; 10<sup>-3</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[cml_i]" CODE="[CML_I]" isMetric="no" class="intcust">
+      <name>circular mil</name>
+      <printSymbol>circ.mil</printSymbol>
+      <property>area</property>
+      <value Unit="[pi]/4.[mil_i]2" UNIT="[PI]/4.[MIL_I]2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[hd_i]" CODE="[HD_I]" isMetric="no" class="intcust">
+      <name>hand</name>
+      <printSymbol>hd</printSymbol>
+      <property>height of horses</property>
+      <value Unit="[in_i]" UNIT="[IN_I]" value="4">4</value>
+   </unit>
+   <unit xmlns="" Code="[ft_us]" CODE="[FT_US]" isMetric="no" class="us-lengths">
+      <name>foot</name>
+      <printSymbol>ft<sub>us</sub>
+      </printSymbol>
+      <property>length</property>
+      <value Unit="m/3937" UNIT="M/3937" value="1200">1200</value>
+   </unit>
+   <unit xmlns="" Code="[yd_us]" CODE="[YD_US]" isMetric="no" class="us-lengths">
+      <name>yard</name>
+      <property>length</property>
+      <value Unit="[ft_us]" UNIT="[FT_US]" value="3">3</value>
+   </unit>
+   <unit xmlns="" Code="[in_us]" CODE="[IN_US]" isMetric="no" class="us-lengths">
+      <name>inch</name>
+      <property>length</property>
+      <value Unit="[ft_us]/12" UNIT="[FT_US]/12" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[rd_us]" CODE="[RD_US]" isMetric="no" class="us-lengths">
+      <name>rod</name>
+      <property>length</property>
+      <value Unit="[ft_us]" UNIT="[FT_US]" value="16.5">16.5</value>
+   </unit>
+   <unit xmlns="" Code="[ch_us]" CODE="[CH_US]" isMetric="no" class="us-lengths">
+      <name>Gunter's chain</name>
+      <name>Surveyor's chain</name>
+      <property>length</property>
+      <value Unit="[rd_us]" UNIT="[RD_US]" value="4">4</value>
+   </unit>
+   <unit xmlns="" Code="[lk_us]" CODE="[LK_US]" isMetric="no" class="us-lengths">
+      <name>link for Gunter's chain</name>
+      <property>length</property>
+      <value Unit="[ch_us]/100" UNIT="[CH_US]/100" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[rch_us]" CODE="[RCH_US]" isMetric="no" class="us-lengths">
+      <name>Ramden's chain</name>
+      <name>Engineer's chain</name>
+      <property>length</property>
+      <value Unit="[ft_us]" UNIT="[FT_US]" value="100">100</value>
+   </unit>
+   <unit xmlns="" Code="[rlk_us]" CODE="[RLK_US]" isMetric="no" class="us-lengths">
+      <name>link for Ramden's chain</name>
+      <property>length</property>
+      <value Unit="[rch_us]/100" UNIT="[RCH_US]/100" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[fth_us]" CODE="[FTH_US]" isMetric="no" class="us-lengths">
+      <name>fathom</name>
+      <property>length</property>
+      <value Unit="[ft_us]" UNIT="[FT_US]" value="6">6</value>
+   </unit>
+   <unit xmlns="" Code="[fur_us]" CODE="[FUR_US]" isMetric="no" class="us-lengths">
+      <name>furlong</name>
+      <property>length</property>
+      <value Unit="[rd_us]" UNIT="[RD_US]" value="40">40</value>
+   </unit>
+   <unit xmlns="" Code="[mi_us]" CODE="[MI_US]" isMetric="no" class="us-lengths">
+      <name>mile</name>
+      <property>length</property>
+      <value Unit="[fur_us]" UNIT="[FUR_US]" value="8">8</value>
+   </unit>
+   <unit xmlns="" Code="[acr_us]" CODE="[ACR_US]" isMetric="no" class="us-lengths">
+      <name>acre</name>
+      <property>area</property>
+      <value Unit="[rd_us]2" UNIT="[RD_US]2" value="160">160</value>
+   </unit>
+   <unit xmlns="" Code="[srd_us]" CODE="[SRD_US]" isMetric="no" class="us-lengths">
+      <name>square rod</name>
+      <property>area</property>
+      <value Unit="[rd_us]2" UNIT="[RD_US]2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[smi_us]" CODE="[SMI_US]" isMetric="no" class="us-lengths">
+      <name>square mile</name>
+      <property>area</property>
+      <value Unit="[mi_us]2" UNIT="[MI_US]2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[sct]" CODE="[SCT]" isMetric="no" class="us-lengths">
+      <name>section</name>
+      <property>area</property>
+      <value Unit="[mi_us]2" UNIT="[MI_US]2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[twp]" CODE="[TWP]" isMetric="no" class="us-lengths">
+      <name>township</name>
+      <property>area</property>
+      <value Unit="[sct]" UNIT="[SCT]" value="36">36</value>
+   </unit>
+   <unit xmlns="" Code="[mil_us]" CODE="[MIL_US]" isMetric="no" class="us-lengths">
+      <name>mil</name>
+      <property>length</property>
+      <value Unit="[in_us]" UNIT="[IN_US]" value="1e-3">1 &#215; 10<sup>-3</sup>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[in_br]" CODE="[IN_BR]" isMetric="no" class="brit-length">
+      <name>inch</name>
+      <property>length</property>
+      <value Unit="cm" UNIT="CM" value="2.539998">2.539998</value>
+   </unit>
+   <unit xmlns="" Code="[ft_br]" CODE="[FT_BR]" isMetric="no" class="brit-length">
+      <name>foot</name>
+      <property>length</property>
+      <value Unit="[in_br]" UNIT="[IN_BR]" value="12">12</value>
+   </unit>
+   <unit xmlns="" Code="[rd_br]" CODE="[RD_BR]" isMetric="no" class="brit-length">
+      <name>rod</name>
+      <property>length</property>
+      <value Unit="[ft_br]" UNIT="[FT_BR]" value="16.5">16.5</value>
+   </unit>
+   <unit xmlns="" Code="[ch_br]" CODE="[CH_BR]" isMetric="no" class="brit-length">
+      <name>Gunter's chain</name>
+      <property>length</property>
+      <value Unit="[rd_br]" UNIT="[RD_BR]" value="4">4</value>
+   </unit>
+   <unit xmlns="" Code="[lk_br]" CODE="[LK_BR]" isMetric="no" class="brit-length">
+      <name>link for Gunter's chain</name>
+      <property>length</property>
+      <value Unit="[ch_br]/100" UNIT="[CH_BR]/100" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[fth_br]" CODE="[FTH_BR]" isMetric="no" class="brit-length">
+      <name>fathom</name>
+      <property>length</property>
+      <value Unit="[ft_br]" UNIT="[FT_BR]" value="6">6</value>
+   </unit>
+   <unit xmlns="" Code="[pc_br]" CODE="[PC_BR]" isMetric="no" class="brit-length">
+      <name>pace</name>
+      <property>length</property>
+      <value Unit="[ft_br]" UNIT="[FT_BR]" value="2.5">2.5</value>
+   </unit>
+   <unit xmlns="" Code="[yd_br]" CODE="[YD_BR]" isMetric="no" class="brit-length">
+      <name>yard</name>
+      <property>length</property>
+      <value Unit="[ft_br]" UNIT="[FT_BR]" value="3">3</value>
+   </unit>
+   <unit xmlns="" Code="[mi_br]" CODE="[MI_BR]" isMetric="no" class="brit-length">
+      <name>mile</name>
+      <property>length</property>
+      <value Unit="[ft_br]" UNIT="[FT_BR]" value="5280">5280</value>
+   </unit>
+   <unit xmlns="" Code="[nmi_br]" CODE="[NMI_BR]" isMetric="no" class="brit-length">
+      <name>nautical mile</name>
+      <property>length</property>
+      <value Unit="[ft_br]" UNIT="[FT_BR]" value="6080">6080</value>
+   </unit>
+   <unit xmlns="" Code="[kn_br]" CODE="[KN_BR]" isMetric="no" class="brit-length">
+      <name>knot</name>
+      <property>velocity</property>
+      <value Unit="[nmi_br]/h" UNIT="[NMI_BR]/H" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[acr_br]" CODE="[ACR_BR]" isMetric="no" class="brit-length">
+      <name>acre</name>
+      <property>area</property>
+      <value Unit="[yd_br]2" UNIT="[YD_BR]2" value="4840">4840</value>
+   </unit>
+   <unit xmlns="" Code="[gal_us]" CODE="[GAL_US]" isMetric="no" class="us-volumes">
+      <name>Queen&#160;Anne's wine gallon</name>
+      <property>fluid volume</property>
+      <value Unit="[in_i]3" UNIT="[IN_I]3" value="231">231</value>
+   </unit>
+   <unit xmlns="" Code="[bbl_us]" CODE="[BBL_US]" isMetric="no" class="us-volumes">
+      <name>barrel</name>
+      <property>fluid volume</property>
+      <value Unit="[gal_us]" UNIT="[GAL_US]" value="42">42</value>
+   </unit>
+   <unit xmlns="" Code="[qt_us]" CODE="[QT_US]" isMetric="no" class="us-volumes">
+      <name>quart</name>
+      <property>fluid volume</property>
+      <value Unit="[gal_us]/4" UNIT="[GAL_US]/4" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[pt_us]" CODE="[PT_US]" isMetric="no" class="us-volumes">
+      <name>pint</name>
+      <property>fluid volume</property>
+      <value Unit="[qt_us]/2" UNIT="[QT_US]/2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[gil_us]" CODE="[GIL_US]" isMetric="no" class="us-volumes">
+      <name>gill</name>
+      <property>fluid volume</property>
+      <value Unit="[pt_us]/4" UNIT="[PT_US]/4" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[foz_us]" CODE="[FOZ_US]" isMetric="no" class="us-volumes">
+      <name>fluid ounce</name>
+      <printSymbol>oz fl</printSymbol>
+      <property>fluid volume</property>
+      <value Unit="[gil_us]/4" UNIT="[GIL_US]/4" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[fdr_us]" CODE="[FDR_US]" isMetric="no" class="us-volumes">
+      <name>fluid dram</name>
+      <property>fluid volume</property>
+      <value Unit="[foz_us]/8" UNIT="[FOZ_US]/8" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[min_us]" CODE="[MIN_US]" isMetric="no" class="us-volumes">
+      <name>minim</name>
+      <property>fluid volume</property>
+      <value Unit="[fdr_us]/60" UNIT="[FDR_US]/60" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[crd_us]" CODE="[CRD_US]" isMetric="no" class="us-volumes">
+      <name>cord</name>
+      <property>fluid volume</property>
+      <value Unit="[ft_i]3" UNIT="[FT_I]3" value="128">128</value>
+   </unit>
+   <unit xmlns="" Code="[bu_us]" CODE="[BU_US]" isMetric="no" class="us-volumes">
+      <name>bushel</name>
+      <property>dry volume</property>
+      <value Unit="[in_i]3" UNIT="[IN_I]3" value="2150.42">2150.42</value>
+   </unit>
+   <unit xmlns="" Code="[gal_wi]" CODE="[GAL_WI]" isMetric="no" class="us-volumes">
+      <name>historical winchester gallon</name>
+      <property>dry volume</property>
+      <value Unit="[bu_us]/8" UNIT="[BU_US]/8" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[pk_us]" CODE="[PK_US]" isMetric="no" class="us-volumes">
+      <name>peck</name>
+      <property>dry volume</property>
+      <value Unit="[bu_us]/4" UNIT="[BU_US]/4" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[dqt_us]" CODE="[DQT_US]" isMetric="no" class="us-volumes">
+      <name>dry quart</name>
+      <property>dry volume</property>
+      <value Unit="[pk_us]/8" UNIT="[PK_US]/8" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[dpt_us]" CODE="[DPT_US]" isMetric="no" class="us-volumes">
+      <name>dry pint</name>
+      <property>dry volume</property>
+      <value Unit="[dqt_us]/2" UNIT="[DQT_US]/2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[tbs_us]" CODE="[TBS_US]" isMetric="no" class="us-volumes">
+      <name>tablespoon</name>
+      <property>volume</property>
+      <value Unit="[foz_us]/2" UNIT="[FOZ_US]/2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[tsp_us]" CODE="[TSP_US]" isMetric="no" class="us-volumes">
+      <name>teaspoon</name>
+      <property>volume</property>
+      <value Unit="[tbs_us]/3" UNIT="[TBS_US]/3" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[cup_us]" CODE="[CUP_US]" isMetric="no" class="us-volumes">
+      <name>cup</name>
+      <property>volume</property>
+      <value Unit="[tbs_us]" UNIT="[TBS_US]" value="16">16</value>
+   </unit>
+   <unit xmlns="" Code="[foz_m]" CODE="[FOZ_M]" isMetric="no" class="us-volumes">
+      <name>metric fluid ounce</name>
+      <printSymbol>oz fl</printSymbol>
+      <property>fluid volume</property>
+      <value Unit="mL" UNIT="ML" value="30">30</value>
+   </unit>
+   <unit xmlns="" Code="[cup_m]" CODE="[CUP_M]" isMetric="no" class="us-volumes">
+      <name>metric cup</name>
+      <property>volume</property>
+      <value Unit="mL" UNIT="ML" value="240">240</value>
+   </unit>
+   <unit xmlns="" Code="[tsp_m]" CODE="[TSP_M]" isMetric="no" class="us-volumes">
+      <name>metric teaspoon</name>
+      <property>volume</property>
+      <value Unit="mL" UNIT="mL" value="5">5</value>
+   </unit>
+   <unit xmlns="" Code="[tbs_m]" CODE="[TBS_M]" isMetric="no" class="us-volumes">
+      <name>metric tablespoon</name>
+      <property>volume</property>
+      <value Unit="mL" UNIT="mL" value="15">15</value>
+   </unit>
+   <unit xmlns="" Code="[gal_br]" CODE="[GAL_BR]" isMetric="no" class="brit-volumes">
+      <name>gallon</name>
+      <property>volume</property>
+      <value Unit="l" UNIT="L" value="4.54609">4.54609</value>
+   </unit>
+   <unit xmlns="" Code="[pk_br]" CODE="[PK_BR]" isMetric="no" class="brit-volumes">
+      <name>peck</name>
+      <property>volume</property>
+      <value Unit="[gal_br]" UNIT="[GAL_BR]" value="2">2</value>
+   </unit>
+   <unit xmlns="" Code="[bu_br]" CODE="[BU_BR]" isMetric="no" class="brit-volumes">
+      <name>bushel</name>
+      <property>volume</property>
+      <value Unit="[pk_br]" UNIT="[PK_BR]" value="4">4</value>
+   </unit>
+   <unit xmlns="" Code="[qt_br]" CODE="[QT_BR]" isMetric="no" class="brit-volumes">
+      <name>quart</name>
+      <property>volume</property>
+      <value Unit="[gal_br]/4" UNIT="[GAL_BR]/4" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[pt_br]" CODE="[PT_BR]" isMetric="no" class="brit-volumes">
+      <name>pint</name>
+      <property>volume</property>
+      <value Unit="[qt_br]/2" UNIT="[QT_BR]/2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[gil_br]" CODE="[GIL_BR]" isMetric="no" class="brit-volumes">
+      <name>gill</name>
+      <property>volume</property>
+      <value Unit="[pt_br]/4" UNIT="[PT_BR]/4" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[foz_br]" CODE="[FOZ_BR]" isMetric="no" class="brit-volumes">
+      <name>fluid ounce</name>
+      <property>volume</property>
+      <value Unit="[gil_br]/5" UNIT="[GIL_BR]/5" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[fdr_br]" CODE="[FDR_BR]" isMetric="no" class="brit-volumes">
+      <name>fluid dram</name>
+      <property>volume</property>
+      <value Unit="[foz_br]/8" UNIT="[FOZ_BR]/8" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[min_br]" CODE="[MIN_BR]" isMetric="no" class="brit-volumes">
+      <name>minim</name>
+      <property>volume</property>
+      <value Unit="[fdr_br]/60" UNIT="[FDR_BR]/60" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[gr]" CODE="[GR]" isMetric="no" class="avoirdupois">
+      <name>grain</name>
+      <property>mass</property>
+      <value Unit="mg" UNIT="MG" value="64.79891">64.79891</value>
+   </unit>
+   <unit xmlns="" Code="[lb_av]" CODE="[LB_AV]" isMetric="no" class="avoirdupois">
+      <name>pound</name>
+      <printSymbol>lb</printSymbol>
+      <property>mass</property>
+      <value Unit="[gr]" UNIT="[GR]" value="7000">7000</value>
+   </unit>
+   <unit xmlns="" Code="[oz_av]" CODE="[OZ_AV]" isMetric="no" class="avoirdupois">
+      <name>ounce</name>
+      <printSymbol>oz</printSymbol>
+      <property>mass</property>
+      <value Unit="[lb_av]/16" UNIT="[LB_AV]/16" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[dr_av]" CODE="[DR_AV]" isMetric="no" class="avoirdupois">
+      <name>dram</name>
+      <property>mass</property>
+      <value Unit="[oz_av]/16" UNIT="[OZ_AV]/16" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[scwt_av]" CODE="[SCWT_AV]" isMetric="no" class="avoirdupois">
+      <name>short hundredweight</name>
+      <name>U.S. hundredweight</name>
+      <property>mass</property>
+      <value Unit="[lb_av]" UNIT="[LB_AV]" value="100">100</value>
+   </unit>
+   <unit xmlns="" Code="[lcwt_av]" CODE="[LCWT_AV]" isMetric="no" class="avoirdupois">
+      <name>long hunderdweight</name>
+      <name>British hundredweight</name>
+      <property>mass</property>
+      <value Unit="[lb_av]" UNIT="[LB_AV]" value="112">112</value>
+   </unit>
+   <unit xmlns="" Code="[ston_av]" CODE="[STON_AV]" isMetric="no" class="avoirdupois">
+      <name>short ton</name>
+      <name>U.S. ton</name>
+      <property>mass</property>
+      <value Unit="[scwt_av]" UNIT="[SCWT_AV]" value="20">20</value>
+   </unit>
+   <unit xmlns="" Code="[lton_av]" CODE="[LTON_AV]" isMetric="no" class="avoirdupois">
+      <name>long ton</name>
+      <name>British ton</name>
+      <property>mass</property>
+      <value Unit="[lcwt_av]" UNIT="[LCWT_AV]" value="20">20</value>
+   </unit>
+   <unit xmlns="" Code="[stone_av]" CODE="[STONE_AV]" isMetric="no" class="avoirdupois">
+      <name>stone</name>
+      <name>British stone</name>
+      <property>mass</property>
+      <value Unit="[lb_av]" UNIT="[LB_AV]" value="14">14</value>
+   </unit>
+   <unit xmlns="" Code="[pwt_tr]" CODE="[PWT_TR]" isMetric="no" class="troy">
+      <name>pennyweight</name>
+      <property>mass</property>
+      <value Unit="[gr]" UNIT="[GR]" value="24">24</value>
+   </unit>
+   <unit xmlns="" Code="[oz_tr]" CODE="[OZ_TR]" isMetric="no" class="troy">
+      <name>ounce</name>
+      <property>mass</property>
+      <value Unit="[pwt_tr]" UNIT="[PWT_TR]" value="20">20</value>
+   </unit>
+   <unit xmlns="" Code="[lb_tr]" CODE="[LB_TR]" isMetric="no" class="troy">
+      <name>pound</name>
+      <property>mass</property>
+      <value Unit="[oz_tr]" UNIT="[OZ_TR]" value="12">12</value>
+   </unit>
+   <unit xmlns="" Code="[sc_ap]" CODE="[SC_AP]" isMetric="no" class="apoth">
+      <name>scruple</name>
+      <property>mass</property>
+      <value Unit="[gr]" UNIT="[GR]" value="20">20</value>
+   </unit>
+   <unit xmlns="" Code="[dr_ap]" CODE="[DR_AP]" isMetric="no" class="apoth">
+      <name>dram</name>
+      <name>drachm</name>
+      <property>mass</property>
+      <value Unit="[sc_ap]" UNIT="[SC_AP]" value="3">3</value>
+   </unit>
+   <unit xmlns="" Code="[oz_ap]" CODE="[OZ_AP]" isMetric="no" class="apoth">
+      <name>ounce</name>
+      <property>mass</property>
+      <value Unit="[dr_ap]" UNIT="[DR_AP]" value="8">8</value>
+   </unit>
+   <unit xmlns="" Code="[lb_ap]" CODE="[LB_AP]" isMetric="no" class="apoth">
+      <name>pound</name>
+      <property>mass</property>
+      <value Unit="[oz_ap]" UNIT="[OZ_AP]" value="12">12</value>
+   </unit>
+   <unit xmlns="" Code="[oz_m]" CODE="[OZ_M]" isMetric="no" class="apoth">
+      <name>metric ounce</name>
+      <property>mass</property>
+      <value Unit="g" UNIT="g" value="28">28</value>
+   </unit>
+   <unit xmlns="" Code="[lne]" CODE="[LNE]" isMetric="no" class="typeset">
+      <name>line</name>
+      <property>length</property>
+      <value Unit="[in_i]/12" UNIT="[IN_I]/12" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[pnt]" CODE="[PNT]" isMetric="no" class="typeset">
+      <name>point</name>
+      <property>length</property>
+      <value Unit="[lne]/6" UNIT="[LNE]/6" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[pca]" CODE="[PCA]" isMetric="no" class="typeset">
+      <name>pica</name>
+      <property>length</property>
+      <value Unit="[pnt]" UNIT="[PNT]" value="12">12</value>
+   </unit>
+   <unit xmlns="" Code="[pnt_pr]" CODE="[PNT_PR]" isMetric="no" class="typeset">
+      <name>Printer's point</name>
+      <property>length</property>
+      <value Unit="[in_i]" UNIT="[IN_I]" value="0.013837">0.013837</value>
+   </unit>
+   <unit xmlns="" Code="[pca_pr]" CODE="[PCA_PR]" isMetric="no" class="typeset">
+      <name>Printer's pica</name>
+      <property>length</property>
+      <value Unit="[pnt_pr]" UNIT="[PNT_PR]" value="12">12</value>
+   </unit>
+   <unit xmlns="" Code="[pied]" CODE="[PIED]" isMetric="no" class="typeset">
+      <name>pied</name>
+      <name>French foot</name>
+      <property>length</property>
+      <value Unit="cm" UNIT="CM" value="32.48">32.48</value>
+   </unit>
+   <unit xmlns="" Code="[pouce]" CODE="[POUCE]" isMetric="no" class="typeset">
+      <name>pouce</name>
+      <name>French inch</name>
+      <property>length</property>
+      <value Unit="[pied]/12" UNIT="[PIED]/12" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[ligne]" CODE="[LIGNE]" isMetric="no" class="typeset">
+      <name>ligne</name>
+      <name>French line</name>
+      <property>length</property>
+      <value Unit="[pouce]/12" UNIT="[POUCE]/12" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[didot]" CODE="[DIDOT]" isMetric="no" class="typeset">
+      <name>didot</name>
+      <name>Didot's point</name>
+      <property>length</property>
+      <value Unit="[ligne]/6" UNIT="[LIGNE]/6" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[cicero]" CODE="[CICERO]" isMetric="no" class="typeset">
+      <name>cicero</name>
+      <name>Didot's pica</name>
+      <property>length</property>
+      <value Unit="[didot]" UNIT="[DIDOT]" value="12">12</value>
+   </unit>
+   <unit xmlns="" Code="[degF]" CODE="[DEGF]" isMetric="no" isSpecial="yes" class="heat">
+      <name>degree Fahrenheit</name>
+      <printSymbol>&#176;F</printSymbol>
+      <property>temperature</property>
+      <value Unit="degf(5 K/9)" UNIT="DEGF(5 K/9)">
+         <function name="degF" value="5" Unit="K/9"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[degR]" CODE="[degR]" isMetric="no" class="heat">
+      <name>degree Rankine</name>
+      <printSymbol>&#176;R</printSymbol>
+      <property>temperature</property>
+      <value value="5" Unit="K/9" UNIT="K/9">5</value>
+   </unit>
+   <unit xmlns="" Code="cal_[15]" CODE="CAL_[15]" isMetric="yes" class="heat">
+      <name>calorie at 15&#160;&#176;C</name>
+      <printSymbol>cal<sub>15&#176;C</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="J" UNIT="J" value="4.18580">4.18580</value>
+   </unit>
+   <unit xmlns="" Code="cal_[20]" CODE="CAL_[20]" isMetric="yes" class="heat">
+      <name>calorie at 20&#160;&#176;C</name>
+      <printSymbol>cal<sub>20&#176;C</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="J" UNIT="J" value="4.18190">4.18190</value>
+   </unit>
+   <unit xmlns="" Code="cal_m" CODE="CAL_M" isMetric="yes" class="heat">
+      <name>mean calorie</name>
+      <printSymbol>cal<sub>m</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="J" UNIT="J" value="4.19002">4.19002</value>
+   </unit>
+   <unit xmlns="" Code="cal_IT" CODE="CAL_IT" isMetric="yes" class="heat">
+      <name>international table calorie</name>
+      <printSymbol>cal<sub>IT</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="J" UNIT="J" value="4.1868">4.1868</value>
+   </unit>
+   <unit xmlns="" Code="cal_th" CODE="CAL_TH" isMetric="yes" class="heat">
+      <name>thermochemical calorie</name>
+      <printSymbol>cal<sub>th</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="J" UNIT="J" value="4.184">4.184</value>
+   </unit>
+   <unit xmlns="" Code="cal" CODE="CAL" isMetric="yes" class="heat">
+      <name>calorie</name>
+      <printSymbol>cal</printSymbol>
+      <property>energy</property>
+      <value Unit="cal_th" UNIT="CAL_TH" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[Cal]" CODE="[CAL]" isMetric="no" class="heat">
+      <name>nutrition label Calories</name>
+      <printSymbol>Cal</printSymbol>
+      <property>energy</property>
+      <value Unit="kcal_th" UNIT="KCAL_TH" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[Btu_39]" CODE="[BTU_39]" isMetric="no" class="heat">
+      <name>British thermal unit at 39&#160;&#176;F</name>
+      <printSymbol>Btu<sub>39&#176;F</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="kJ" UNIT="kJ" value="1.05967">1.05967</value>
+   </unit>
+   <unit xmlns="" Code="[Btu_59]" CODE="[BTU_59]" isMetric="no" class="heat">
+      <name>British thermal unit at 59&#160;&#176;F</name>
+      <printSymbol>Btu<sub>59&#176;F</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="kJ" UNIT="kJ" value="1.05480">1.05480</value>
+   </unit>
+   <unit xmlns="" Code="[Btu_60]" CODE="[BTU_60]" isMetric="no" class="heat">
+      <name>British thermal unit at 60&#160;&#176;F</name>
+      <printSymbol>Btu<sub>60&#176;F</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="kJ" UNIT="kJ" value="1.05468">1.05468</value>
+   </unit>
+   <unit xmlns="" Code="[Btu_m]" CODE="[BTU_M]" isMetric="no" class="heat">
+      <name>mean British thermal unit</name>
+      <printSymbol>Btu<sub>m</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="kJ" UNIT="kJ" value="1.05587">1.05587</value>
+   </unit>
+   <unit xmlns="" Code="[Btu_IT]" CODE="[BTU_IT]" isMetric="no" class="heat">
+      <name>international table British thermal unit</name>
+      <printSymbol>Btu<sub>IT</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="kJ" UNIT="kJ" value="1.05505585262">1.05505585262</value>
+   </unit>
+   <unit xmlns="" Code="[Btu_th]" CODE="[BTU_TH]" isMetric="no" class="heat">
+      <name>thermochemical British thermal unit</name>
+      <printSymbol>Btu<sub>th</sub>
+      </printSymbol>
+      <property>energy</property>
+      <value Unit="kJ" UNIT="kJ" value="1.054350">1.054350</value>
+   </unit>
+   <unit xmlns="" Code="[Btu]" CODE="[BTU]" isMetric="no" class="heat">
+      <name>British thermal unit</name>
+      <printSymbol>btu</printSymbol>
+      <property>energy</property>
+      <value Unit="[Btu_th]" UNIT="[BTU_TH]" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[HP]" CODE="[HP]" isMetric="no" class="heat">
+      <name>horsepower</name>
+      <property>power</property>
+      <value Unit="[ft_i].[lbf_av]/s" UNIT="[FT_I].[LBF_AV]/S" value="550">550</value>
+   </unit>
+   <unit xmlns="" Code="tex" CODE="TEX" isMetric="yes" class="heat">
+      <name>tex</name>
+      <printSymbol>tex</printSymbol>
+      <property>linear mass density (of textile thread)</property>
+      <value value="1" Unit="g/km" UNIT="G/KM">1</value>
+   </unit>
+   <unit xmlns="" Code="[den]" CODE="[DEN]" isMetric="no" class="heat">
+      <name>Denier</name>
+      <printSymbol>den</printSymbol>
+      <property>linear mass density (of textile thread)</property>
+      <value value="1" Unit="g/9/km" UNIT="G/9/KM">1</value>
+   </unit>
+   <unit xmlns="" Code="m[H2O]" CODE="M[H2O]" isMetric="yes" class="clinical">
+      <name>meter of water column</name>
+      <printSymbol>m&#160;H<sub>
+            <r>2</r>
+         </sub>O</printSymbol>
+      <property>pressure</property>
+      <value Unit="kPa" UNIT="KPAL" value="980665e-5">9.80665</value>
+   </unit>
+   <unit xmlns="" Code="m[Hg]" CODE="M[HG]" isMetric="yes" class="clinical">
+      <name>meter of mercury column</name>
+      <printSymbol>m&#160;Hg</printSymbol>
+      <property>pressure</property>
+      <value Unit="kPa" UNIT="KPAL" value="133.3220">133.3220</value>
+   </unit>
+   <unit xmlns="" Code="[in_i'H2O]" CODE="[IN_I'H2O]" isMetric="no" class="clinical">
+      <name>inch of water column</name>
+      <printSymbol>in&#160;H<sub>
+            <r>2</r>
+         </sub>O</printSymbol>
+      <property>pressure</property>
+      <value Unit="m[H2O].[in_i]/m" UNIT="M[H2O].[IN_I]/M" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[in_i'Hg]" CODE="[IN_I'HG]" isMetric="no" class="clinical">
+      <name>inch of mercury column</name>
+      <printSymbol>in&#160;Hg</printSymbol>
+      <property>pressure</property>
+      <value Unit="m[Hg].[in_i]/m" UNIT="M[HG].[IN_I]/M" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[PRU]" CODE="[PRU]" isMetric="no" class="clinical">
+      <name>peripheral vascular resistance unit</name>
+      <printSymbol>P.R.U.</printSymbol>
+      <property>fluid resistance</property>
+      <value Unit="mm[Hg].s/ml" UNIT="MM[HG].S/ML" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[wood'U]" CODE="[WOOD'U]" isMetric="no" class="clinical">
+      <name>Wood unit</name>
+      <printSymbol>Wood U.</printSymbol>
+      <property>fluid resistance</property>
+      <value Unit="mm[Hg].min/L" UNIT="MM[HG].MIN/L" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[diop]" CODE="[DIOP]" isMetric="no" class="clinical">
+      <name>diopter</name>
+      <printSymbol>dpt</printSymbol>
+      <property>refraction of a lens</property>
+      <value Unit="/m" UNIT="/M" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[p'diop]" CODE="[P'DIOP]" isMetric="no" isSpecial="yes"
+         class="clinical">
+      <name>prism diopter</name>
+      <printSymbol>PD</printSymbol>
+      <property>refraction of a prism</property>
+      <value Unit="100tan(1 rad)" UNIT="100TAN(1 RAD)">
+         <function name="tanTimes100" value="1" Unit="deg"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="%[slope]" CODE="%[SLOPE]" isMetric="no" isSpecial="yes"
+         class="clinical">
+      <name>percent of slope</name>
+      <printSymbol>%</printSymbol>
+      <property>slope</property>
+      <value Unit="100tan(1 rad)" UNIT="100TAN(1 RAD)">
+         <function name="100tan" value="1" Unit="deg"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[mesh_i]" CODE="[MESH_I]" isMetric="no" class="clinical">
+      <name>mesh</name>
+      <property>lineic number</property>
+      <value Unit="/[in_i]" UNIT="/[IN_I]" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[Ch]" CODE="[CH]" isMetric="no" class="clinical">
+      <name>Charri&#232;re</name>
+      <name>french</name>
+      <printSymbol>Ch</printSymbol>
+      <property>gauge of catheters</property>
+      <value Unit="mm/3" UNIT="MM/3" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[drp]" CODE="[DRP]" isMetric="no" class="clinical">
+      <name>drop</name>
+      <printSymbol>drp</printSymbol>
+      <property>volume</property>
+      <value Unit="ml/20" UNIT="ML/20" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[hnsf'U]" CODE="[HNSF'U]" isMetric="no" class="clinical">
+      <name>Hounsfield unit</name>
+      <printSymbol>HF</printSymbol>
+      <property>x-ray attenuation</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[MET]" CODE="[MET]" isMetric="no" class="clinical">
+      <name>metabolic equivalent</name>
+      <printSymbol>MET</printSymbol>
+      <property>metabolic cost of physical activity</property>
+      <value Unit="mL/min/kg" UNIT="ML/MIN/KG" value="3.5">3.5</value>
+   </unit>
+   <unit xmlns="" Code="[hp'_X]" CODE="[HP'_X]" isMetric="no" isSpecial="yes"
+         class="clinical">
+      <name>homeopathic potency of decimal series (retired)</name>
+      <printSymbol>X</printSymbol>
+      <property>homeopathic potency (retired)</property>
+      <value Unit="hpX(1 1)" UNIT="HPX(1 1)">
+         <function name="hpX" value="1" Unit="1"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[hp'_C]" CODE="[HP'_C]" isMetric="no" isSpecial="yes"
+         class="clinical">
+      <name>homeopathic potency of centesimal series (retired)</name>
+      <printSymbol>C</printSymbol>
+      <property>homeopathic potency (retired)</property>
+      <value Unit="hpC(1 1)" UNIT="HPC(1 1)">
+         <function name="hpC" value="1" Unit="1"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[hp'_M]" CODE="[HP'_M]" isMetric="no" isSpecial="yes"
+         class="clinical">
+      <name>homeopathic potency of millesimal series (retired)</name>
+      <printSymbol>M</printSymbol>
+      <property>homeopathic potency (retired)</property>
+      <value Unit="hpM(1 1)" UNIT="HPM(1 1)">
+         <function name="hpM" value="1" Unit="1"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[hp'_Q]" CODE="[HP'_Q]" isMetric="no" isSpecial="yes"
+         class="clinical">
+      <name>homeopathic potency of quintamillesimal series (retired)</name>
+      <printSymbol>Q</printSymbol>
+      <property>homeopathic potency (retired)</property>
+      <value Unit="hpQ(1 1)" UNIT="HPQ(1 1)">
+         <function name="hpQ" value="1" Unit="1"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="[hp_X]" CODE="[HP_X]" isMetric="no" isArbitrary="yes"
+         class="clinical">
+      <name>homeopathic potency of decimal hahnemannian series</name>
+      <printSymbol>X</printSymbol>
+      <property>homeopathic potency (Hahnemann)</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[hp_C]" CODE="[HP_C]" isMetric="no" isArbitrary="yes"
+         class="clinical">
+      <name>homeopathic potency of centesimal hahnemannian series</name>
+      <printSymbol>C</printSymbol>
+      <property>homeopathic potency (Hahnemann)</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[hp_M]" CODE="[HP_M]" isMetric="no" isArbitrary="yes"
+         class="clinical">
+      <name>homeopathic potency of millesimal hahnemannian series</name>
+      <printSymbol>M</printSymbol>
+      <property>homeopathic potency (Hahnemann)</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[hp_Q]" CODE="[HP_Q]" isMetric="no" isArbitrary="yes"
+         class="clinical">
+      <name>homeopathic potency of quintamillesimal hahnemannian series</name>
+      <printSymbol>Q</printSymbol>
+      <property>homeopathic potency (Hahnemann)</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[kp_X]" CODE="[KP_X]" isMetric="no" isArbitrary="yes"
+         class="clinical">
+      <name>homeopathic potency of decimal korsakovian series</name>
+      <printSymbol>X</printSymbol>
+      <property>homeopathic potency (Korsakov)</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[kp_C]" CODE="[KP_C]" isMetric="no" isArbitrary="yes"
+         class="clinical">
+      <name>homeopathic potency of centesimal korsakovian series</name>
+      <printSymbol>C</printSymbol>
+      <property>homeopathic potency (Korsakov)</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[kp_M]" CODE="[KP_M]" isMetric="no" isArbitrary="yes"
+         class="clinical">
+      <name>homeopathic potency of millesimal korsakovian series</name>
+      <printSymbol>M</printSymbol>
+      <property>homeopathic potency (Korsakov)</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[kp_Q]" CODE="[KP_Q]" isMetric="no" isArbitrary="yes"
+         class="clinical">
+      <name>homeopathic potency of quintamillesimal korsakovian series</name>
+      <printSymbol>Q</printSymbol>
+      <property>homeopathic potency (Korsakov)</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="eq" CODE="EQ" isMetric="yes" class="chemical">
+      <name>equivalents</name>
+      <printSymbol>eq</printSymbol>
+      <property>amount of substance</property>
+      <value Unit="mol" UNIT="MOL" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="osm" CODE="OSM" isMetric="yes" class="chemical">
+      <name>osmole</name>
+      <printSymbol>osm</printSymbol>
+      <property>amount of substance (dissolved particles)</property>
+      <value Unit="mol" UNIT="MOL" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[pH]" CODE="[PH]" isMetric="no" isSpecial="yes" class="chemical">
+      <name>pH</name>
+      <printSymbol>pH</printSymbol>
+      <property>acidity</property>
+      <value Unit="pH(1 mol/l)" UNIT="PH(1 MOL/L)">
+         <function name="pH" value="1" Unit="mol/l"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="g%" CODE="G%" isMetric="yes" class="chemical">
+      <name>gram percent</name>
+      <printSymbol>g%</printSymbol>
+      <property>mass concentration</property>
+      <value Unit="g/dl" UNIT="G/DL" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[S]" CODE="[S]" isMetric="no" class="chemical">
+      <name>Svedberg unit</name>
+      <printSymbol>S</printSymbol>
+      <property>sedimentation coefficient</property>
+      <value Unit="10*-13.s" UNIT="10*-13.S" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[HPF]" CODE="[HPF]" isMetric="no" class="chemical">
+      <name>high power field</name>
+      <printSymbol>HPF</printSymbol>
+      <property>view area in microscope</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[LPF]" CODE="[LPF]" isMetric="no" class="chemical">
+      <name>low power field</name>
+      <printSymbol>LPF</printSymbol>
+      <property>view area in microscope</property>
+      <value Unit="1" UNIT="1" value="100">100</value>
+   </unit>
+   <unit xmlns="" Code="kat" CODE="KAT" isMetric="yes" class="chemical">
+      <name>katal</name>
+      <printSymbol>kat</printSymbol>
+      <property>catalytic activity</property>
+      <value Unit="mol/s" UNIT="MOL/S" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="U" CODE="U" isMetric="yes" class="chemical">
+      <name>Unit</name>
+      <printSymbol>U</printSymbol>
+      <property>catalytic activity</property>
+      <value Unit="umol/min" UNIT="UMOL/MIN" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[iU]" CODE="[IU]" isMetric="yes" isArbitrary="yes"
+         class="chemical">
+      <name>international unit</name>
+      <printSymbol>IU</printSymbol>
+      <property>arbitrary</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[IU]" CODE="[IU]" isMetric="yes" isArbitrary="yes"
+         class="chemical">
+      <name>international unit</name>
+      <printSymbol>i.U.</printSymbol>
+      <property>arbitrary</property>
+      <value Unit="[iU]" UNIT="[IU]" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[arb'U]" CODE="[ARB'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>arbitary unit</name>
+      <printSymbol>arb. U</printSymbol>
+      <property>arbitrary</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[USP'U]" CODE="[USP'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>United States Pharmacopeia unit</name>
+      <printSymbol>U.S.P.</printSymbol>
+      <property>arbitrary</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[GPL'U]" CODE="[GPL'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>GPL unit</name>
+      <property>biologic activity of anticardiolipin IgG</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[MPL'U]" CODE="[MPL'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>MPL unit</name>
+      <property>biologic activity of anticardiolipin IgM</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[APL'U]" CODE="[APL'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>APL unit</name>
+      <property>biologic activity of anticardiolipin IgA</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[beth'U]" CODE="[BETH'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>Bethesda unit</name>
+      <property>biologic activity of factor VIII inhibitor</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[anti'Xa'U]" CODE="[ANTI'XA'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>anti factor Xa unit</name>
+      <property>biologic activity of factor Xa inhibitor (heparin)</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[todd'U]" CODE="[TODD'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>Todd unit</name>
+      <property>biologic activity antistreptolysin O</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[dye'U]" CODE="[DYE'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>Dye unit</name>
+      <property>biologic activity of amylase</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[smgy'U]" CODE="[SMGY'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>Somogyi unit</name>
+      <property>biologic activity of amylase</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[bdsk'U]" CODE="[BDSK'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>Bodansky unit</name>
+      <property>biologic activity of phosphatase</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[ka'U]" CODE="[KA'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>King-Armstrong unit</name>
+      <property>biologic activity of phosphatase</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[knk'U]" CODE="[KNK'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>Kunkel unit</name>
+      <property>arbitrary biologic activity</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[mclg'U]" CODE="[MCLG'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>Mac Lagan unit</name>
+      <property>arbitrary biologic activity</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[tb'U]" CODE="[TB'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>tuberculin unit</name>
+      <property>biologic activity of tuberculin</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[CCID_50]" CODE="[CCID_50]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>50% cell culture infectious dose</name>
+      <printSymbol>CCID<sub>50</sub>
+      </printSymbol>
+      <property>biologic activity (infectivity) of an infectious agent preparation</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[TCID_50]" CODE="[TCID_50]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>50% tissue culture infectious dose</name>
+      <printSymbol>TCID<sub>50</sub>
+      </printSymbol>
+      <property>biologic activity (infectivity) of an infectious agent preparation</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[EID_50]" CODE="[EID_50]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>50% embryo infectious dose</name>
+      <printSymbol>EID<sub>50</sub>
+      </printSymbol>
+      <property>biologic activity (infectivity) of an infectious agent preparation</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[PFU]" CODE="[PFU]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>plaque forming units</name>
+      <printSymbol>PFU</printSymbol>
+      <property>amount of an infectious agent</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[FFU]" CODE="[FFU]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>focus forming units</name>
+      <printSymbol>FFU</printSymbol>
+      <property>amount of an infectious agent</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[CFU]" CODE="[CFU]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>colony forming units</name>
+      <printSymbol>CFU</printSymbol>
+      <property>amount of a proliferating organism</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[BAU]" CODE="[BAU]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>bioequivalent allergen unit</name>
+      <printSymbol>BAU</printSymbol>
+      <property>amount of an allergen callibrated through in-vivo testing based on the ID50EAL method of (intradermal dilution for 50mm sum of erythema diameters</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[AU]" CODE="[AU]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>allergen unit</name>
+      <printSymbol>AU</printSymbol>
+      <property>procedure defined amount of an allergen using some reference standard</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[Amb'a'1'U]" CODE="[AMB'A'1'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>allergen unit for Ambrosia artemisiifolia</name>
+      <printSymbol>Amb a 1 U</printSymbol>
+      <property>procedure defined amount of the major allergen of ragweed.</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[PNU]" CODE="[PNU]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>protein nitrogen unit</name>
+      <printSymbol>PNU</printSymbol>
+      <property>procedure defined amount of a protein substance</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[Lf]" CODE="[LF]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>Limit of flocculation</name>
+      <printSymbol>Lf</printSymbol>
+      <property>procedure defined amount of an antigen substance</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[D'ag'U]" CODE="[D'AG'U]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>D-antigen unit</name>
+      <printSymbol/>
+      <property>procedure defined amount of a poliomyelitis d-antigen substance</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[FEU]" CODE="[FEU]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>fibrinogen equivalent unit</name>
+      <printSymbol/>
+      <property>amount of fibrinogen broken down into the measured d-dimers</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[ELU]" CODE="[ELU]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>ELISA unit</name>
+      <printSymbol/>
+      <property>arbitrary ELISA unit</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[EU]" CODE="[EU]" isMetric="no" isArbitrary="yes"
+         class="chemical">
+      <name>Ehrlich unit</name>
+      <printSymbol/>
+      <property>Ehrlich unit</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Np" CODE="NEP" isMetric="yes" isSpecial="yes" class="levels">
+      <name>neper</name>
+      <printSymbol>Np</printSymbol>
+      <property>level</property>
+      <value Unit="ln(1 1)" UNIT="LN(1 1)">
+         <function name="ln" value="1" Unit="1"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="B" CODE="B" isMetric="yes" isSpecial="yes" class="levels">
+      <name>bel</name>
+      <printSymbol>B</printSymbol>
+      <property>level</property>
+      <value Unit="lg(1 1)" UNIT="LG(1 1)">
+         <function name="lg" value="1" Unit="1"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="B[SPL]" CODE="B[SPL]" isMetric="yes" isSpecial="yes"
+         class="levels">
+      <name>bel sound pressure</name>
+      <printSymbol>B(SPL)</printSymbol>
+      <property>pressure level</property>
+      <value Unit="2lg(2 10*-5.Pa)" UNIT="2LG(2 10*-5.PAL)">
+         <function name="lgTimes2" value="2" Unit="10*-5.Pa"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="B[V]" CODE="B[V]" isMetric="yes" isSpecial="yes" class="levels">
+      <name>bel volt</name>
+      <printSymbol>B(V)</printSymbol>
+      <property>electric potential level</property>
+      <value Unit="2lg(1 V)" UNIT="2LG(1 V)">
+         <function name="lgTimes2" value="1" Unit="V"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="B[mV]" CODE="B[MV]" isMetric="yes" isSpecial="yes" class="levels">
+      <name>bel millivolt</name>
+      <printSymbol>B(mV)</printSymbol>
+      <property>electric potential level</property>
+      <value Unit="2lg(1 mV)" UNIT="2LG(1 MV)">
+         <function name="lgTimes2" value="1" Unit="mV"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="B[uV]" CODE="B[UV]" isMetric="yes" isSpecial="yes" class="levels">
+      <name>bel microvolt</name>
+      <printSymbol>B(&#956;V)</printSymbol>
+      <property>electric potential level</property>
+      <value Unit="2lg(1 uV)" UNIT="2LG(1 UV)">
+         <function name="lgTimes2" value="1" Unit="uV"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="B[10.nV]" CODE="B[10.NV]" isMetric="yes" isSpecial="yes"
+         class="levels">
+      <name>bel 10 nanovolt</name>
+      <printSymbol>B(10 nV)</printSymbol>
+      <property>electric potential level</property>
+      <value Unit="2lg(10 nV)" UNIT="2LG(10 NV)">
+         <function name="lgTimes2" value="10" Unit="nV"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="B[W]" CODE="B[W]" isMetric="yes" isSpecial="yes" class="levels">
+      <name>bel watt</name>
+      <printSymbol>B(W)</printSymbol>
+      <property>power level</property>
+      <value Unit="lg(1 W)" UNIT="LG(1 W)">
+         <function name="lg" value="1" Unit="W"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="B[kW]" CODE="B[KW]" isMetric="yes" isSpecial="yes" class="levels">
+      <name>bel kilowatt</name>
+      <printSymbol>B(kW)</printSymbol>
+      <property>power level</property>
+      <value Unit="lg(1 kW)" UNIT="LG(1 KW)">
+         <function name="lg" value="1" Unit="kW"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="st" CODE="STR" isMetric="yes" class="misc">
+      <name>stere</name>
+      <printSymbol>st</printSymbol>
+      <property>volume</property>
+      <value Unit="m3" UNIT="M3" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="Ao" CODE="AO" isMetric="no" class="misc">
+      <name>&#197;ngstr&#246;m</name>
+      <printSymbol>&#197;</printSymbol>
+      <property>length</property>
+      <value Unit="nm" UNIT="NM" value="0.1">0.1</value>
+   </unit>
+   <unit xmlns="" Code="b" CODE="BRN" isMetric="no" class="misc">
+      <name>barn</name>
+      <printSymbol>b</printSymbol>
+      <property>action area</property>
+      <value Unit="fm2" UNIT="FM2" value="100">100</value>
+   </unit>
+   <unit xmlns="" Code="att" CODE="ATT" isMetric="no" class="misc">
+      <name>technical atmosphere</name>
+      <printSymbol>at</printSymbol>
+      <property>pressure</property>
+      <value Unit="kgf/cm2" UNIT="KGF/CM2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="mho" CODE="MHO" isMetric="yes" class="misc">
+      <name>mho</name>
+      <printSymbol>mho</printSymbol>
+      <property>electric conductance</property>
+      <value Unit="S" UNIT="S" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[psi]" CODE="[PSI]" isMetric="no" class="misc">
+      <name>pound per sqare inch</name>
+      <printSymbol>psi</printSymbol>
+      <property>pressure</property>
+      <value Unit="[lbf_av]/[in_i]2" UNIT="[LBF_AV]/[IN_I]2" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="circ" CODE="CIRC" isMetric="no" class="misc">
+      <name>circle</name>
+      <printSymbol>circ</printSymbol>
+      <property>plane angle</property>
+      <value Unit="[pi].rad" UNIT="[PI].RAD" value="2">2</value>
+   </unit>
+   <unit xmlns="" Code="sph" CODE="SPH" isMetric="no" class="misc">
+      <name>spere</name>
+      <printSymbol>sph</printSymbol>
+      <property>solid angle</property>
+      <value Unit="[pi].sr" UNIT="[PI].SR" value="4">4</value>
+   </unit>
+   <unit xmlns="" Code="[car_m]" CODE="[CAR_M]" isMetric="no" class="misc">
+      <name>metric carat</name>
+      <printSymbol>ct<sub>m</sub>
+      </printSymbol>
+      <property>mass</property>
+      <value Unit="g" UNIT="G" value="2e-1">0.2</value>
+   </unit>
+   <unit xmlns="" Code="[car_Au]" CODE="[CAR_AU]" isMetric="no" class="misc">
+      <name>carat of gold alloys</name>
+      <printSymbol>ct<sub>
+            <r>Au</r>
+         </sub>
+      </printSymbol>
+      <property>mass fraction</property>
+      <value Unit="/24" UNIT="/24" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="[smoot]" CODE="[SMOOT]" isMetric="no" class="misc">
+      <name>Smoot</name>
+      <printSymbol/>
+      <property>length</property>
+      <value Unit="[in_i]" UNIT="[IN_I]" value="67">67</value>
+   </unit>
+   <unit xmlns="" Code="bit_s" CODE="BIT_S" isMetric="no" isSpecial="yes"
+         class="infotech">
+      <name>bit</name>
+      <printSymbol>bit<sub>s</sub>
+      </printSymbol>
+      <property>amount of information</property>
+      <value Unit="ld(1 1)" UNIT="ld(1 1)">
+         <function name="ld" value="1" Unit="1"/>
+      </value>
+   </unit>
+   <unit xmlns="" Code="bit" CODE="BIT" isMetric="yes" class="infotech">
+      <name>bit</name>
+      <printSymbol>bit</printSymbol>
+      <property>amount of information</property>
+      <value Unit="1" UNIT="1" value="1">1</value>
+   </unit>
+   <unit xmlns="" Code="By" CODE="BY" isMetric="yes" class="infotech">
+      <name>byte</name>
+      <printSymbol>B</printSymbol>
+      <property>amount of information</property>
+      <value Unit="bit" UNIT="bit" value="8">8</value>
+   </unit>
+   <unit xmlns="" Code="Bd" CODE="BD" isMetric="yes" class="infotech">
+      <name>baud</name>
+      <printSymbol>Bd</printSymbol>
+      <property>signal transmission rate</property>
+      <value Unit="/s" UNIT="/s" value="1">1</value>
+   </unit>
+   <prefix xmlns="" Code="Ki" CODE="KIB">
+      <name>kibi</name>
+      <printSymbol>Ki</printSymbol>
+      <value value="1024">1024</value>
+   </prefix>
+   <prefix xmlns="" Code="Mi" CODE="MIB">
+      <name>mebi</name>
+      <printSymbol>Mi</printSymbol>
+      <value value="1048576">1048576</value>
+   </prefix>
+   <prefix xmlns="" Code="Gi" CODE="GIB">
+      <name>gibi</name>
+      <printSymbol>Gi</printSymbol>
+      <value value="1073741824">1073741824</value>
+   </prefix>
+   <prefix xmlns="" Code="Ti" CODE="TIB">
+      <name>tebi</name>
+      <printSymbol>Ti</printSymbol>
+      <value value="1099511627776">1099511627776</value>
+   </prefix>
 </root>
\ No newline at end of file
diff --git a/examples/ucum/pom.xml b/examples/ucum/pom.xml
index 42b50a9..7b069ad 100644
--- a/examples/ucum/pom.xml
+++ b/examples/ucum/pom.xml
@@ -1,15 +1,15 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.uomo</groupId>
-    <artifactId>org.eclipse.uomo.examples</artifactId>
-    <version>0.7.0-SNAPSHOT</version>
-  </parent>
-  <groupId>org.eclipse.uomo.examples.ucum</groupId>
-  <artifactId>org.eclipse.uomo.examples.ucum</artifactId>
-  <packaging>pom</packaging>
-  <name>Eclipse UOMo UCUM Examples</name>
-  <modules>
-  	<module>org.eclipse.uomo.examples.ucum.console</module>
-  </modules>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.uomo</groupId>
+    <artifactId>org.eclipse.uomo.examples</artifactId>
+    <version>0.7.0-SNAPSHOT</version>
+  </parent>
+  <groupId>org.eclipse.uomo.examples.ucum</groupId>
+  <artifactId>org.eclipse.uomo.examples.ucum</artifactId>
+  <packaging>pom</packaging>
+  <name>Eclipse UOMo UCUM Examples</name>
+  <modules>
+  	<module>org.eclipse.uomo.examples.ucum.console</module>
+  </modules>
 </project>
\ No newline at end of file
diff --git a/examples/units/.gitignore b/examples/units/.gitignore
index ea8c4bf..0b42d2d 100644
--- a/examples/units/.gitignore
+++ b/examples/units/.gitignore
@@ -1 +1 @@
-/target
+/target
diff --git a/examples/units/.project b/examples/units/.project
index ea8a7db..0502e80 100644
--- a/examples/units/.project
+++ b/examples/units/.project
@@ -1,17 +1,17 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.uomo.examples.units</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.uomo.examples.units</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/units/org.eclipse.uomo.examples.units.android/.gitignore b/examples/units/org.eclipse.uomo.examples.units.android/.gitignore
index ea8c4bf..0b42d2d 100644
--- a/examples/units/org.eclipse.uomo.examples.units.android/.gitignore
+++ b/examples/units/org.eclipse.uomo.examples.units.android/.gitignore
@@ -1 +1 @@
-/target
+/target
diff --git a/examples/units/org.eclipse.uomo.examples.units.android/player/.gitignore b/examples/units/org.eclipse.uomo.examples.units.android/player/.gitignore
index 945bcb2..33c9b12 100644
--- a/examples/units/org.eclipse.uomo.examples.units.android/player/.gitignore
+++ b/examples/units/org.eclipse.uomo.examples.units.android/player/.gitignore
@@ -1,3 +1,3 @@
-/bin
-/gen
-/target
+/bin
+/gen
+/target
diff --git a/examples/units/org.eclipse.uomo.examples.units.android/player/.project b/examples/units/org.eclipse.uomo.examples.units.android/player/.project
index 06bd759..ae08877 100644
--- a/examples/units/org.eclipse.uomo.examples.units.android/player/.project
+++ b/examples/units/org.eclipse.uomo.examples.units.android/player/.project
@@ -1,39 +1,39 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>player</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>player</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/units/org.eclipse.uomo.examples.units.android/player/AndroidManifest.xml b/examples/units/org.eclipse.uomo.examples.units.android/player/AndroidManifest.xml
index 8d5c1a8..03992e3 100644
--- a/examples/units/org.eclipse.uomo.examples.units.android/player/AndroidManifest.xml
+++ b/examples/units/org.eclipse.uomo.examples.units.android/player/AndroidManifest.xml
@@ -1,15 +1,15 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-  package="org.org.eclipse.uomo.examples.units.android" android:versionCode="1" android:versionName="0.1.0.SNAPSHOT">
-
-  <application android:icon="@drawable/icon" android:label="@string/app_name">
-    <activity android:name=".HelloAndroidActivity">
-      <intent-filter>
-        <action android:name="android.intent.action.MAIN" />
-        <category android:name="android.intent.category.LAUNCHER" />
-      </intent-filter>
-    </activity>
-  </application>
-
-</manifest>
-
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+  package="org.org.eclipse.uomo.examples.units.android" android:versionCode="1" android:versionName="0.1.0.SNAPSHOT">
+
+  <application android:icon="@drawable/icon" android:label="@string/app_name">
+    <activity android:name=".HelloAndroidActivity">
+      <intent-filter>
+        <action android:name="android.intent.action.MAIN" />
+        <category android:name="android.intent.category.LAUNCHER" />
+      </intent-filter>
+    </activity>
+  </application>
+
+</manifest>
+
diff --git a/examples/units/org.eclipse.uomo.examples.units.android/player/project.properties b/examples/units/org.eclipse.uomo.examples.units.android/player/project.properties
index ea89160..df1e5c0 100644
--- a/examples/units/org.eclipse.uomo.examples.units.android/player/project.properties
+++ b/examples/units/org.eclipse.uomo.examples.units.android/player/project.properties
@@ -1,11 +1,11 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-8
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system use,
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+
+# Project target.
+target=android-8
diff --git a/examples/units/org.eclipse.uomo.examples.units.android/player/res/layout/main.xml b/examples/units/org.eclipse.uomo.examples.units.android/player/res/layout/main.xml
index 09d2d1b..113ba30 100644
--- a/examples/units/org.eclipse.uomo.examples.units.android/player/res/layout/main.xml
+++ b/examples/units/org.eclipse.uomo.examples.units.android/player/res/layout/main.xml
@@ -1,12 +1,12 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    >
-<TextView  
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content" 
-    android:text="@string/hello"
-    />
-</LinearLayout>
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    >
+<TextView  
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content" 
+    android:text="@string/hello"
+    />
+</LinearLayout>
diff --git a/examples/units/org.eclipse.uomo.examples.units.android/player/res/values/strings.xml b/examples/units/org.eclipse.uomo.examples.units.android/player/res/values/strings.xml
index 8862e88..f1e711d 100644
--- a/examples/units/org.eclipse.uomo.examples.units.android/player/res/values/strings.xml
+++ b/examples/units/org.eclipse.uomo.examples.units.android/player/res/values/strings.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="hello">Hello player!</string>
-    <string name="app_name">player</string>
-</resources>
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="hello">Hello player!</string>
+    <string name="app_name">player</string>
+</resources>
diff --git a/examples/units/org.eclipse.uomo.examples.units.android/player/src/main/java/org/org/eclipse/uomo/examples/units/android/HelloAndroidActivity.java b/examples/units/org.eclipse.uomo.examples.units.android/player/src/main/java/org/org/eclipse/uomo/examples/units/android/HelloAndroidActivity.java
index 6bf7ec0..af06a50 100644
--- a/examples/units/org.eclipse.uomo.examples.units.android/player/src/main/java/org/org/eclipse/uomo/examples/units/android/HelloAndroidActivity.java
+++ b/examples/units/org.eclipse.uomo.examples.units.android/player/src/main/java/org/org/eclipse/uomo/examples/units/android/HelloAndroidActivity.java
@@ -1,25 +1,25 @@
-package org.org.eclipse.uomo.examples.units.android;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.util.Log;
-
-public class HelloAndroidActivity extends Activity {
-
-    private static String TAG = "player";
-
-    /**
-     * Called when the activity is first created.
-     * @param savedInstanceState If the activity is being re-initialized after 
-     * previously being shut down then this Bundle contains the data it most 
-     * recently supplied in onSaveInstanceState(Bundle). <b>Note: Otherwise it is null.</b>
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-		Log.i(TAG, "onCreate");
-        setContentView(R.layout.main);
-    }
-
-}
-
+package org.org.eclipse.uomo.examples.units.android;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+
+public class HelloAndroidActivity extends Activity {
+
+    private static String TAG = "player";
+
+    /**
+     * Called when the activity is first created.
+     * @param savedInstanceState If the activity is being re-initialized after 
+     * previously being shut down then this Bundle contains the data it most 
+     * recently supplied in onSaveInstanceState(Bundle). <b>Note: Otherwise it is null.</b>
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+		Log.i(TAG, "onCreate");
+        setContentView(R.layout.main);
+    }
+
+}
+
diff --git a/examples/units/org.eclipse.uomo.examples.units.android/pom.xml b/examples/units/org.eclipse.uomo.examples.units.android/pom.xml
index daf641a..ce3af8a 100644
--- a/examples/units/org.eclipse.uomo.examples.units.android/pom.xml
+++ b/examples/units/org.eclipse.uomo.examples.units.android/pom.xml
@@ -1,39 +1,39 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-        <artifactId>org.eclipse.uomo.examples.units</artifactId>
-        <groupId>org.eclipse.uomo.examples.units</groupId>
-        <version>0.7.0-SNAPSHOT</version>
-    </parent>
-	<artifactId>org.eclipse.uomo.examples.units.android</artifactId>
-	<packaging>pom</packaging>
-	<name>UOMo Units Android Examples</name>
-	<build>
-		<pluginManagement>
-			<plugins>
-				<plugin>
-					<artifactId>maven-compiler-plugin</artifactId>
-					<version>${maven.compilerPlugin.version}</version>
-					<configuration>
-						<source>${project.build.javaVersion}</source>
-						<target>${project.build.javaVersion}</target>
-					</configuration>
-				</plugin>
-			</plugins>
-		</pluginManagement>
-	</build>
-
-	<dependencies>
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<version>3.8.1</version>
-			<scope>test</scope>
-		</dependency>
-	</dependencies>
-  <modules>
-    <module>web</module>
-    <module>player</module>
-  </modules>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+        <artifactId>org.eclipse.uomo.examples.units</artifactId>
+        <groupId>org.eclipse.uomo.examples.units</groupId>
+        <version>0.7.0-SNAPSHOT</version>
+    </parent>
+	<artifactId>org.eclipse.uomo.examples.units.android</artifactId>
+	<packaging>pom</packaging>
+	<name>UOMo Units Android Examples</name>
+	<build>
+		<pluginManagement>
+			<plugins>
+				<plugin>
+					<artifactId>maven-compiler-plugin</artifactId>
+					<version>${maven.compilerPlugin.version}</version>
+					<configuration>
+						<source>${project.build.javaVersion}</source>
+						<target>${project.build.javaVersion}</target>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+	</build>
+
+	<dependencies>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>3.8.1</version>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+  <modules>
+    <module>web</module>
+    <module>player</module>
+  </modules>
 </project>
\ No newline at end of file
diff --git a/examples/units/org.eclipse.uomo.examples.units.android/web/.classpath b/examples/units/org.eclipse.uomo.examples.units.android/web/.classpath
index 5e745f7..fa05dac 100644
--- a/examples/units/org.eclipse.uomo.examples.units.android/web/.classpath
+++ b/examples/units/org.eclipse.uomo.examples.units.android/web/.classpath
@@ -1,28 +1,28 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" output="target/classes" path="src/main/java">
-		<attributes>
-			<attribute name="optional" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.jboss.ide.eclipse.as.core.server.runtime.runtimeTarget/JBoss 7.0 Runtime"/>
-	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
-		<attributes>
-			<attribute name="optional" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
-		<attributes>
-			<attribute name="maven.pomderived" value="true"/>
-			<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
-		<attributes>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.jboss.ide.eclipse.as.core.server.runtime.runtimeTarget/JBoss 7.0 Runtime"/>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/examples/units/org.eclipse.uomo.examples.units.android/web/.gitignore b/examples/units/org.eclipse.uomo.examples.units.android/web/.gitignore
index ea8c4bf..0b42d2d 100644
--- a/examples/units/org.eclipse.uomo.examples.units.android/web/.gitignore
+++ b/examples/units/org.eclipse.uomo.examples.units.android/web/.gitignore
@@ -1 +1 @@
-/target
+/target
diff --git a/examples/units/org.eclipse.uomo.examples.units.android/web/.project b/examples/units/org.eclipse.uomo.examples.units.android/web/.project
index e13faeb..d8bd967 100644
--- a/examples/units/org.eclipse.uomo.examples.units.android/web/.project
+++ b/examples/units/org.eclipse.uomo.examples.units.android/web/.project
@@ -1,48 +1,48 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>web</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.wst.common.project.facet.core.builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.jboss.tools.ws.jaxrs.metamodelBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.wst.validation.validationbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
-		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
-		<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
-		<nature>org.jboss.tools.ws.jaxrs.nature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>web</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.jboss.tools.ws.jaxrs.metamodelBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.validation.validationbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+		<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+		<nature>org.jboss.tools.ws.jaxrs.nature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/units/org.eclipse.uomo.examples.units.android/web/.settings/.jsdtscope b/examples/units/org.eclipse.uomo.examples.units.android/web/.settings/.jsdtscope
index b46b920..fac399c 100644
--- a/examples/units/org.eclipse.uomo.examples.units.android/web/.settings/.jsdtscope
+++ b/examples/units/org.eclipse.uomo.examples.units.android/web/.settings/.jsdtscope
@@ -1,12 +1,12 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src/main/webapp"/>
-	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject">
-		<attributes>
-			<attribute name="hide" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
-	<classpathentry kind="output" path=""/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src/main/webapp"/>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject">
+		<attributes>
+			<attribute name="hide" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
+	<classpathentry kind="output" path=""/>
+</classpath>
diff --git a/examples/units/org.eclipse.uomo.examples.units.android/web/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml b/examples/units/org.eclipse.uomo.examples.units.android/web/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml
index cc81385..b01fdb7 100644
--- a/examples/units/org.eclipse.uomo.examples.units.android/web/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml
+++ b/examples/units/org.eclipse.uomo.examples.units.android/web/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml
@@ -1,7 +1,7 @@
-<root>
-  <facet id="jst.jaxrs">
-    <node name="libprov">
-      <attribute name="provider-id" value="jaxrs-no-op-library-provider"/>
-    </node>
-  </facet>
-</root>
+<root>
+  <facet id="jst.jaxrs">
+    <node name="libprov">
+      <attribute name="provider-id" value="jaxrs-no-op-library-provider"/>
+    </node>
+  </facet>
+</root>
diff --git a/examples/units/org.eclipse.uomo.examples.units.android/web/src/main/webapp/WEB-INF/web.xml b/examples/units/org.eclipse.uomo.examples.units.android/web/src/main/webapp/WEB-INF/web.xml
index 28802c7..866c739 100644
--- a/examples/units/org.eclipse.uomo.examples.units.android/web/src/main/webapp/WEB-INF/web.xml
+++ b/examples/units/org.eclipse.uomo.examples.units.android/web/src/main/webapp/WEB-INF/web.xml
@@ -1,37 +1,37 @@
-<!DOCTYPE web-app PUBLIC
- "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
- "http://java.sun.com/dtd/web-app_2_3.dtd" >
-
-<web-app>
-  <display-name>UOMo Units Android Example Web Application</display-name>
-  <servlet>
-  	<servlet-name>UnitConverterServlet</servlet-name>
-  	<display-name>UnitConverterServlet</display-name>
-  	<description>Unit Converter</description>
-  	<servlet-class>org.eclipse.uomo.examples.units.android.web.UnitConverterServlet</servlet-class>
-  	<init-param>
-  		<param-name>unit</param-name>
-  		<param-value></param-value>
-  		<description>Unit</description>
-  	</init-param>
-  	<init-param>
-  		<param-name>value</param-name>
-  		<param-value></param-value>
-  		<description>Value</description>
-  	</init-param>
-  </servlet>
-  <servlet>
-  	<servlet-name>Tempconv</servlet-name>
-  	<display-name>Tempconv</display-name>
-  	<description>Temperature Converter</description>
-  	<servlet-class>org.eclipse.uomo.examples.units.android.web.sandbox.Tempconv</servlet-class>
-  </servlet>
-  <servlet-mapping>
-  	<servlet-name>UnitConverterServlet</servlet-name>
-  	<url-pattern>/UnitConverter</url-pattern>
-  </servlet-mapping>
-  <servlet-mapping>
-  	<servlet-name>Tempconv</servlet-name>
-  	<url-pattern>/Tempconv</url-pattern>
-  </servlet-mapping>
-</web-app>
+<!DOCTYPE web-app PUBLIC
+ "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+ "http://java.sun.com/dtd/web-app_2_3.dtd" >
+
+<web-app>
+  <display-name>UOMo Units Android Example Web Application</display-name>
+  <servlet>
+  	<servlet-name>UnitConverterServlet</servlet-name>
+  	<display-name>UnitConverterServlet</display-name>
+  	<description>Unit Converter</description>
+  	<servlet-class>org.eclipse.uomo.examples.units.android.web.UnitConverterServlet</servlet-class>
+  	<init-param>
+  		<param-name>unit</param-name>
+  		<param-value></param-value>
+  		<description>Unit</description>
+  	</init-param>
+  	<init-param>
+  		<param-name>value</param-name>
+  		<param-value></param-value>
+  		<description>Value</description>
+  	</init-param>
+  </servlet>
+  <servlet>
+  	<servlet-name>Tempconv</servlet-name>
+  	<display-name>Tempconv</display-name>
+  	<description>Temperature Converter</description>
+  	<servlet-class>org.eclipse.uomo.examples.units.android.web.sandbox.Tempconv</servlet-class>
+  </servlet>
+  <servlet-mapping>
+  	<servlet-name>UnitConverterServlet</servlet-name>
+  	<url-pattern>/UnitConverter</url-pattern>
+  </servlet-mapping>
+  <servlet-mapping>
+  	<servlet-name>Tempconv</servlet-name>
+  	<url-pattern>/Tempconv</url-pattern>
+  </servlet-mapping>
+</web-app>
diff --git a/examples/units/org.eclipse.uomo.examples.units.android/web/src/main/webapp/index.jsp b/examples/units/org.eclipse.uomo.examples.units.android/web/src/main/webapp/index.jsp
index c344610..f10ef21 100644
--- a/examples/units/org.eclipse.uomo.examples.units.android/web/src/main/webapp/index.jsp
+++ b/examples/units/org.eclipse.uomo.examples.units.android/web/src/main/webapp/index.jsp
@@ -1,13 +1,13 @@
-<%@ page import="org.unitsofmeasurement.quantity.*, org.eclipse.uomo.units.*, org.eclipse.uomo.units.impl.quantity.*" %>
-<html>
-<head>
-	<title>Eclipse UOMo</title>
-</head>
-<body>
-<h2>Hello UOMo!</h2>
-<%
-	Quantity<Length> q = new LengthAmount(12, SI.METRE);
-%>
-<%= q %>
-</body>
-</html>
+<%@ page import="org.unitsofmeasurement.quantity.*, org.eclipse.uomo.units.*, org.eclipse.uomo.units.impl.quantity.*" %>
+<html>
+<head>
+	<title>Eclipse UOMo</title>
+</head>
+<body>
+<h2>Hello UOMo!</h2>
+<%
+	Quantity<Length> q = new LengthAmount(12, SI.METRE);
+%>
+<%= q %>
+</body>
+</html>
diff --git a/examples/units/org.eclipse.uomo.examples.units.console/.classpath b/examples/units/org.eclipse.uomo.examples.units.console/.classpath
index ea2b731..ab2b25d 100644
--- a/examples/units/org.eclipse.uomo.examples.units.console/.classpath
+++ b/examples/units/org.eclipse.uomo.examples.units.console/.classpath
@@ -1,37 +1,37 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" output="target/classes" path="src/main/java">
-		<attributes>
-			<attribute name="optional" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
-		<attributes>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
-		<attributes>
-			<attribute name="optional" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
-		<attributes>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
-		<attributes>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
-		<attributes>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/examples/units/org.eclipse.uomo.examples.units.console/.gitignore b/examples/units/org.eclipse.uomo.examples.units.console/.gitignore
index e7da900..1a315ce 100644
--- a/examples/units/org.eclipse.uomo.examples.units.console/.gitignore
+++ b/examples/units/org.eclipse.uomo.examples.units.console/.gitignore
@@ -1,3 +1,3 @@
-/target
-/.settings
-/target
+/target
+/.settings
+/target
diff --git a/examples/units/org.eclipse.uomo.examples.units.console/pom.xml b/examples/units/org.eclipse.uomo.examples.units.console/pom.xml
index 34daec7..10faf8a 100644
--- a/examples/units/org.eclipse.uomo.examples.units.console/pom.xml
+++ b/examples/units/org.eclipse.uomo.examples.units.console/pom.xml
@@ -1,85 +1,85 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<artifactId>org.eclipse.uomo.examples.units</artifactId>
-		<groupId>org.eclipse.uomo.examples.units</groupId>
-		<version>0.7.0-SNAPSHOT</version>
-	</parent>
-	<artifactId>org.eclipse.uomo.examples.units.console</artifactId>
-	<name>UOMo Units Console Examples</name>
-	<dependencies>
-		<dependency>
-            <groupId>org.unitsofmeasurement</groupId>
-            <artifactId>unit-api</artifactId>
-		</dependency>	
-        <dependency>
-        	<groupId>org.eclipse.uomo</groupId>
-        	<artifactId>org.eclipse.uomo.units</artifactId>
-        </dependency>	
-		<dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.hamcrest</groupId>
-            <artifactId>hamcrest-all</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-        	<groupId>org.eclipse.uomo</groupId>
-        	<artifactId>org.eclipse.uomo.core</artifactId>   	
-        </dependency>
-        <dependency>
-        	<groupId>com.ibm.icu</groupId>
-        	<artifactId>icu4j</artifactId>
-        </dependency>
-		<dependency>
-			<groupId>org.eclipse</groupId>
-			<artifactId>osgi</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.eclipse.uomo</groupId>
-			<artifactId>org.eclipse.uomo.util</artifactId>
-		</dependency>
-	</dependencies>
-
-	<!-- ======================================================= -->
-	<!-- Build Settings -->
-	<!-- ======================================================= -->
-	<build>
-		<plugins>
-			<!-- ======================================================= -->
-			<!-- Compilation -->
-			<!-- ======================================================= -->
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-compiler-plugin</artifactId>
-				<version>2.3.2</version>
-				<configuration>
-					<source>${project.build.javaVersion}</source>
-					<target>${project.build.javaVersion}</target>
-					<encoding>${project.build.sourceEncoding}</encoding>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
-	
-	 <!-- ==================================================== -->
-    <!-- Repositories. This is where Maven looks for dependencies. The Maven 
-        repository is implicit and doesn't need to be specified. -->
-    <!-- ==================================================== -->
-    <repositories>
-        <repository>
-            <id>maven-geotoolkit.org</id>
-            <name>GeoToolkit Repository for Maven</name>
-            <url>http://maven.geotoolkit.org/</url>
-        </repository>
-        <repository>
-			<id>eclipse-central</id>
-			<name>Central Eclipse.org Nexus</name>
-			<url>http://maven.eclipse.org/nexus/content/groups/central/</url>
-		</repository>               
-    </repositories>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<artifactId>org.eclipse.uomo.examples.units</artifactId>
+		<groupId>org.eclipse.uomo.examples.units</groupId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.uomo.examples.units.console</artifactId>
+	<name>UOMo Units Console Examples</name>
+	<dependencies>
+		<dependency>
+            <groupId>org.unitsofmeasurement</groupId>
+            <artifactId>unit-api</artifactId>
+		</dependency>	
+        <dependency>
+        	<groupId>org.eclipse.uomo</groupId>
+        	<artifactId>org.eclipse.uomo.units</artifactId>
+        </dependency>	
+		<dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest-all</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+        	<groupId>org.eclipse.uomo</groupId>
+        	<artifactId>org.eclipse.uomo.core</artifactId>   	
+        </dependency>
+        <dependency>
+        	<groupId>com.ibm.icu</groupId>
+        	<artifactId>icu4j</artifactId>
+        </dependency>
+		<dependency>
+			<groupId>org.eclipse</groupId>
+			<artifactId>osgi</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse.uomo</groupId>
+			<artifactId>org.eclipse.uomo.util</artifactId>
+		</dependency>
+	</dependencies>
+
+	<!-- ======================================================= -->
+	<!-- Build Settings -->
+	<!-- ======================================================= -->
+	<build>
+		<plugins>
+			<!-- ======================================================= -->
+			<!-- Compilation -->
+			<!-- ======================================================= -->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>2.3.2</version>
+				<configuration>
+					<source>${project.build.javaVersion}</source>
+					<target>${project.build.javaVersion}</target>
+					<encoding>${project.build.sourceEncoding}</encoding>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+	
+	 <!-- ==================================================== -->
+    <!-- Repositories. This is where Maven looks for dependencies. The Maven 
+        repository is implicit and doesn't need to be specified. -->
+    <!-- ==================================================== -->
+    <repositories>
+        <repository>
+            <id>maven-geotoolkit.org</id>
+            <name>GeoToolkit Repository for Maven</name>
+            <url>http://maven.geotoolkit.org/</url>
+        </repository>
+        <repository>
+			<id>eclipse-central</id>
+			<name>Central Eclipse.org Nexus</name>
+			<url>http://maven.eclipse.org/nexus/content/groups/central/</url>
+		</repository>               
+    </repositories>
 </project>
\ No newline at end of file
diff --git a/examples/units/org.eclipse.uomo.examples.units.console/src/etc/org.eclipse.uomo.examples.units.console.launch b/examples/units/org.eclipse.uomo.examples.units.console/src/etc/org.eclipse.uomo.examples.units.console.launch
index 372196f..3ca885e 100644
--- a/examples/units/org.eclipse.uomo.examples.units.console/src/etc/org.eclipse.uomo.examples.units.console.launch
+++ b/examples/units/org.eclipse.uomo.examples.units.console/src/etc/org.eclipse.uomo.examples.units.console.launch
@@ -1,21 +1,21 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/org.eclipse.uomo.examples.units.console"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="4"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
-<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=org.eclipse.uomo.examples.units.console"/>
-<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
-<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
-<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
-<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.uomo.examples.units.console"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-DconsoleOutput=true"/>
-</launchConfiguration>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/org.eclipse.uomo.examples.units.console"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="4"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=org.eclipse.uomo.examples.units.console"/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
+<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.uomo.examples.units.console"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-DconsoleOutput=true"/>
+</launchConfiguration>
diff --git a/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/Beerfest.java b/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/Beerfest.java
index 0a36570..7577b35 100644
--- a/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/Beerfest.java
+++ b/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/Beerfest.java
@@ -1,20 +1,20 @@
-package org.eclipse.uomo.examples.units.console.sandbox;
-
-import org.eclipse.uomo.units.IMeasure;
-import org.eclipse.uomo.units.impl.system.Imperial;
-import org.eclipse.uomo.units.impl.system.USCustomary;
-import org.eclipse.uomo.units.impl.quantity.VolumeAmount;
-import org.unitsofmeasurement.quantity.Volume;
-
-public class Beerfest {
-
-	public static void main(String[] args) {
-		IMeasure<Volume> v= new VolumeAmount(.5d, USCustomary.LITER);
-		System.out.println(v);
-		System.out.print(v.doubleValue(Imperial.PINT)); 
-		System.out.println(" " + Imperial.PINT);
-		System.out.print(v.doubleValue(USCustomary.OUNCE_LIQUID)); 
-		System.out.println(" " + USCustomary.OUNCE_LIQUID);
-	}
-
-}
+package org.eclipse.uomo.examples.units.console.sandbox;
+
+import org.eclipse.uomo.units.IMeasure;
+import org.eclipse.uomo.units.impl.system.Imperial;
+import org.eclipse.uomo.units.impl.system.USCustomary;
+import org.eclipse.uomo.units.impl.quantity.VolumeAmount;
+import org.unitsofmeasurement.quantity.Volume;
+
+public class Beerfest {
+
+	public static void main(String[] args) {
+		IMeasure<Volume> v= new VolumeAmount(.5d, USCustomary.LITER);
+		System.out.println(v);
+		System.out.print(v.doubleValue(Imperial.PINT)); 
+		System.out.println(" " + Imperial.PINT);
+		System.out.print(v.doubleValue(USCustomary.OUNCE_LIQUID)); 
+		System.out.println(" " + USCustomary.OUNCE_LIQUID);
+	}
+
+}
diff --git a/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/HealthExamples.java b/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/HealthExamples.java
index 8f6d2fa..fd69592 100644
--- a/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/HealthExamples.java
+++ b/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/HealthExamples.java
@@ -1,45 +1,45 @@
-/**
- * Copyright (c) 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.examples.units.console.sandbox;
-
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.uomo.examples.units.types.Health;
-import org.eclipse.uomo.examples.units.types.HeartRate;
-import org.eclipse.uomo.examples.units.types.HeartRateAmount;
-import org.eclipse.uomo.units.IMeasure;
-
-/**
- * @author Werner Keil
- * @version 0.1
- */
-public class HealthExamples {
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		List<IMeasure<HeartRate>> rates = new LinkedList<IMeasure<HeartRate>>();
-		int value = 0;
-		for (int i=0; i<50; i++) {
-	        value = (int) (Math.random() * 40 + 50);
-		
-			IMeasure<HeartRate> rate = new HeartRateAmount(value, Health.BPM);
-			rates.add(rate);
-		}
-		
-		for (IMeasure<HeartRate> r : rates) {
-			System.out.println("Rate: " + r);
-		}
-	}
-
-}
+/**
+ * Copyright (c) 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.examples.units.console.sandbox;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.uomo.examples.units.types.Health;
+import org.eclipse.uomo.examples.units.types.HeartRate;
+import org.eclipse.uomo.examples.units.types.HeartRateAmount;
+import org.eclipse.uomo.units.IMeasure;
+
+/**
+ * @author Werner Keil
+ * @version 0.1
+ */
+public class HealthExamples {
+
+	/**
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		List<IMeasure<HeartRate>> rates = new LinkedList<IMeasure<HeartRate>>();
+		int value = 0;
+		for (int i=0; i<50; i++) {
+	        value = (int) (Math.random() * 40 + 50);
+		
+			IMeasure<HeartRate> rate = new HeartRateAmount(value, Health.BPM);
+			rates.add(rate);
+		}
+		
+		for (IMeasure<HeartRate> r : rates) {
+			System.out.println("Rate: " + r);
+		}
+	}
+
+}
diff --git a/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/KawaExample.java b/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/KawaExample.java
index 69ae5b6..b3ef9d3 100644
--- a/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/KawaExample.java
+++ b/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/KawaExample.java
@@ -1,35 +1,35 @@
-package org.eclipse.uomo.examples.units.console.sandbox;
-
-import org.eclipse.uomo.units.IMeasure;
-import org.eclipse.uomo.units.SI;
-import org.eclipse.uomo.units.impl.quantity.LengthAmount;
-import org.eclipse.uomo.units.impl.quantity.MassAmount;
-import org.unitsofmeasurement.quantity.Length;
-import org.unitsofmeasurement.quantity.Mass;
-import org.unitsofmeasurement.quantity.Quantity;
-import org.unitsofmeasurement.unit.Unit;
-
-
-public class KawaExample {
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Unit<Length> m = SI.METRE;
-		Unit<Mass> g = SI.GRAM;
-		
-		Unit<?> result = g.multiply(m);
-		System.out.println(result);
-		
-		IMeasure<Length> q1 = new LengthAmount(1, m);
-		System.out.println(q1);
-		IMeasure<Mass> q2 = new MassAmount(1, g);
-		System.out.println(q2);
-		Quantity<?> q3 = q1.multiply(q2);
-		System.out.println(q3);
-//		Quantity<Length> q4 = q1.add(q2); // this fails at compile time, not at runtime
-//		System.out.println(q4);
-	}
-
-}
+package org.eclipse.uomo.examples.units.console.sandbox;
+
+import org.eclipse.uomo.units.IMeasure;
+import org.eclipse.uomo.units.SI;
+import org.eclipse.uomo.units.impl.quantity.LengthAmount;
+import org.eclipse.uomo.units.impl.quantity.MassAmount;
+import org.unitsofmeasurement.quantity.Length;
+import org.unitsofmeasurement.quantity.Mass;
+import org.unitsofmeasurement.quantity.Quantity;
+import org.unitsofmeasurement.unit.Unit;
+
+
+public class KawaExample {
+
+	/**
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		Unit<Length> m = SI.METRE;
+		Unit<Mass> g = SI.GRAM;
+		
+		Unit<?> result = g.multiply(m);
+		System.out.println(result);
+		
+		IMeasure<Length> q1 = new LengthAmount(1, m);
+		System.out.println(q1);
+		IMeasure<Mass> q2 = new MassAmount(1, g);
+		System.out.println(q2);
+		Quantity<?> q3 = q1.multiply(q2);
+		System.out.println(q3);
+//		Quantity<Length> q4 = q1.add(q2); // this fails at compile time, not at runtime
+//		System.out.println(q4);
+	}
+
+}
diff --git a/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/ObsoleteUnitsExample.java b/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/ObsoleteUnitsExample.java
index 6e4a2a0..3cefc34 100644
--- a/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/ObsoleteUnitsExample.java
+++ b/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/ObsoleteUnitsExample.java
@@ -1,44 +1,44 @@
-/**
- * Copyright (c) 2012, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.examples.units.console.sandbox;
-
-import static org.eclipse.uomo.examples.units.types.GermanObsolete.*;
-import static org.eclipse.uomo.units.impl.system.USCustomary.FOOT;
-import static org.eclipse.uomo.units.SI.*;
-
-import org.eclipse.uomo.examples.units.types.PolishObsolete;
-import org.eclipse.uomo.units.IMeasure;
-import org.eclipse.uomo.units.impl.BaseAmount;
-import org.unitsofmeasurement.quantity.Length;
-
-/**
- * @author Werner Keil
- *
- */
-public class ObsoleteUnitsExample {
-
-	/**
-	 * @param args
-	 */
-	@SuppressWarnings("deprecation")
-	public static void main(String[] args) {
-		IMeasure<Length> l = BaseAmount.valueOf(10, METRE);
-		System.out.println(l);
-		System.out.println(l.to(FOOT));
-		System.out.println(l.to(FOOT_ZURICH));
-		System.out.println(l.to(STONE_FOOT));
-		System.out.println(l.to(FOOT_LAUSANNE));
-		System.out.println(l.to(ELL_NORTH));
-		System.out.println(l.to(ELL_SOUTH));
-		System.out.println(l.to(PolishObsolete.ELL));
-	}
-
-}
+/**
+ * Copyright (c) 2012, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.examples.units.console.sandbox;
+
+import static org.eclipse.uomo.examples.units.types.GermanObsolete.*;
+import static org.eclipse.uomo.units.impl.system.USCustomary.FOOT;
+import static org.eclipse.uomo.units.SI.*;
+
+import org.eclipse.uomo.examples.units.types.PolishObsolete;
+import org.eclipse.uomo.units.IMeasure;
+import org.eclipse.uomo.units.impl.BaseAmount;
+import org.unitsofmeasurement.quantity.Length;
+
+/**
+ * @author Werner Keil
+ *
+ */
+public class ObsoleteUnitsExample {
+
+	/**
+	 * @param args
+	 */
+	@SuppressWarnings("deprecation")
+	public static void main(String[] args) {
+		IMeasure<Length> l = BaseAmount.valueOf(10, METRE);
+		System.out.println(l);
+		System.out.println(l.to(FOOT));
+		System.out.println(l.to(FOOT_ZURICH));
+		System.out.println(l.to(STONE_FOOT));
+		System.out.println(l.to(FOOT_LAUSANNE));
+		System.out.println(l.to(ELL_NORTH));
+		System.out.println(l.to(ELL_SOUTH));
+		System.out.println(l.to(PolishObsolete.ELL));
+	}
+
+}
diff --git a/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/RadiologicalEmergencyPreparedness.java b/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/RadiologicalEmergencyPreparedness.java
index 90fefe5..f862ccb 100644
--- a/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/RadiologicalEmergencyPreparedness.java
+++ b/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/RadiologicalEmergencyPreparedness.java
@@ -1,51 +1,51 @@
-/**
- * Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.examples.units.console.sandbox;
-
-import static org.eclipse.uomo.units.SI.Prefix.MILLI;
-import static org.eclipse.uomo.units.SI.*;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.uomo.units.IMeasure;
-import org.eclipse.uomo.units.impl.quantity.IonizingRadiationAmount;
-import org.unitsofmeasurement.quantity.IonizingRadiation;
-
-/**
- * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * 
- * @see <a
- *      href="http://www.nema.ne.gov/technological/dose-limits.html">NEMA:
- *      Radiological Emergency Preparedness</a>
- */
-public class RadiologicalEmergencyPreparedness {
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Map <IMeasure<IonizingRadiation>, String> repMap = new HashMap<IMeasure<IonizingRadiation>, String>();
-		IonizingRadiationAmount ira = new IonizingRadiationAmount(100, MILLI(ROENTGEN));
-		
-		repMap.put(ira, SandboxMessages.REP_100mR);
-		ira = new IonizingRadiationAmount(1, ROENTGEN);
-		repMap.put(ira, SandboxMessages.REP_1R);
-		ira = new IonizingRadiationAmount(2.5, ROENTGEN);
-		repMap.put(ira, SandboxMessages.REP_2dot5R);
-		
-		for (IMeasure<IonizingRadiation> dosimeterLimit : repMap.keySet()) {			
-			System.out.println(dosimeterLimit + " :: " + repMap.get(dosimeterLimit));
-		}
-		
-	}
-
-}
+/**
+ * Copyright (c) 2005, 2011, Werner Keil, Ikayzo and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.examples.units.console.sandbox;
+
+import static org.eclipse.uomo.units.SI.Prefix.MILLI;
+import static org.eclipse.uomo.units.SI.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.uomo.units.IMeasure;
+import org.eclipse.uomo.units.impl.quantity.IonizingRadiationAmount;
+import org.unitsofmeasurement.quantity.IonizingRadiation;
+
+/**
+ * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * 
+ * @see <a
+ *      href="http://www.nema.ne.gov/technological/dose-limits.html">NEMA:
+ *      Radiological Emergency Preparedness</a>
+ */
+public class RadiologicalEmergencyPreparedness {
+
+	/**
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		Map <IMeasure<IonizingRadiation>, String> repMap = new HashMap<IMeasure<IonizingRadiation>, String>();
+		IonizingRadiationAmount ira = new IonizingRadiationAmount(100, MILLI(ROENTGEN));
+		
+		repMap.put(ira, SandboxMessages.REP_100mR);
+		ira = new IonizingRadiationAmount(1, ROENTGEN);
+		repMap.put(ira, SandboxMessages.REP_1R);
+		ira = new IonizingRadiationAmount(2.5, ROENTGEN);
+		repMap.put(ira, SandboxMessages.REP_2dot5R);
+		
+		for (IMeasure<IonizingRadiation> dosimeterLimit : repMap.keySet()) {			
+			System.out.println(dosimeterLimit + " :: " + repMap.get(dosimeterLimit));
+		}
+		
+	}
+
+}
diff --git a/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/TemperatureExample.java b/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/TemperatureExample.java
index 9c3fd4a..a813e53 100644
--- a/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/TemperatureExample.java
+++ b/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/console/sandbox/TemperatureExample.java
@@ -1,36 +1,36 @@
-/**
- * Copyright (c) 2005, 2014, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.examples.units.console.sandbox;
-
-import org.eclipse.uomo.units.AbstractQuantity;
-import org.eclipse.uomo.units.SI;
-import org.eclipse.uomo.units.impl.quantity.TemperatureAmount;
-import org.eclipse.uomo.units.impl.system.USCustomary;
-import org.unitsofmeasurement.quantity.Temperature;
-
-/**
- * @author Werner Keil
- * @version 1.1
- *
- */
-public class TemperatureExample {
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		TemperatureAmount temp1 = new TemperatureAmount(0, SI.CELSIUS);
-		AbstractQuantity<Temperature> temp2 = temp1.to(SI.KELVIN);
-		AbstractQuantity<Temperature> temp3 = temp1.to(USCustomary.FAHRENHEIT);
-		System.out.println(temp1 + " -> " + temp2 + " -> " + temp3);
-	}
-
-}
+/**
+ * Copyright (c) 2005, 2014, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.examples.units.console.sandbox;
+
+import org.eclipse.uomo.units.AbstractQuantity;
+import org.eclipse.uomo.units.SI;
+import org.eclipse.uomo.units.impl.quantity.TemperatureAmount;
+import org.eclipse.uomo.units.impl.system.USCustomary;
+import org.unitsofmeasurement.quantity.Temperature;
+
+/**
+ * @author Werner Keil
+ * @version 1.1
+ *
+ */
+public class TemperatureExample {
+
+	/**
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		TemperatureAmount temp1 = new TemperatureAmount(0, SI.CELSIUS);
+		AbstractQuantity<Temperature> temp2 = temp1.to(SI.KELVIN);
+		AbstractQuantity<Temperature> temp3 = temp1.to(USCustomary.FAHRENHEIT);
+		System.out.println(temp1 + " -> " + temp2 + " -> " + temp3);
+	}
+
+}
diff --git a/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/types/DwarfPlanet.java b/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/types/DwarfPlanet.java
index 6f4e8c5..9f8be84 100644
--- a/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/types/DwarfPlanet.java
+++ b/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/types/DwarfPlanet.java
@@ -1,93 +1,93 @@
-/**
- * Copyright (c) 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.examples.units.types;
-
-import static org.eclipse.uomo.units.SI.*;
-import static org.eclipse.uomo.units.SI.Prefix.KILO;
-import static org.eclipse.uomo.examples.units.types.SolarSystem.G;
-
-import org.eclipse.uomo.units.IMeasure;
-import org.eclipse.uomo.units.impl.quantity.AccelerationAmount;
-import org.eclipse.uomo.units.impl.quantity.LengthAmount;
-import org.eclipse.uomo.units.impl.quantity.MassAmount;
-import org.unitsofmeasurement.quantity.Acceleration;
-import org.unitsofmeasurement.quantity.Length;
-import org.unitsofmeasurement.quantity.Mass;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.0
- * 
- * This <type>enum</type> is inspired by Josh Bloch's example in <a href="http://www.oracle.com/technetwork/java/effectivejava-136174.html">Effective Java Second Edition</a>
- * 
- * <p>
- * Suppose you want to add data and behavior to an enum. 
- * For example consider <a href="http://en.wikipedia.org/wiki/Dwarf_planet">dwarf planets</a> of the <a href="http://en.wikipedia.org/wiki/Solar_System">solar system</a>. 
- * Each planet knows its mass and radius, and can calculate its surface gravity and the weight of an object on the planet. 
- * Here is how it looks:
- * </p>
- */
-public enum DwarfPlanet {
-	CERES(newMass(9.43e+20, KILOGRAM), newLength(0.4873e6, METRE)),
-    PLUTO(newMass(1.305e+22, KILOGRAM), newLength(1.153e6, METRE)),
-    HAUMEA(newMass(4.006e+21, KILOGRAM), newLength(620, KILO(METRE))),
-    MAKEMAKE(newMass(3e+21, KILOGRAM), newLength(715, KILO(METRE))),
-    ERIS(newMass(1.67e+22, KILOGRAM), newLength(1163, KILO(METRE)));
-
-    private final IMeasure<Mass> mass;   // in kilograms
-
-    private final IMeasure<Length> radius; // in meters
-
-    DwarfPlanet(IMeasure<Mass> mass, IMeasure<Length> radius) {
-        this.mass = mass;
-        this.radius = radius;
-    }
-
-    public IMeasure<Mass> getMass() {
-        return mass;
-    }
-
-    public IMeasure<Length> getRadius() {
-        return radius;
-    }
-
-    public Acceleration surfaceGravity() {
-        double m = mass.doubleValue(KILOGRAM);
-        double r = radius.doubleValue(METRE);
-        return new AccelerationAmount(
-                G * m / (r * r), METRES_PER_SQUARE_SECOND);
-    }
-
-    private static IMeasure<Mass> newMass(double value, Unit<Mass> unit) {
-        return new MassAmount(value, unit);
-    }
-
-    private static IMeasure<Length> newLength(double value, Unit<Length> unit) {
-        return new LengthAmount(value, unit);
-    }
-
-	@Override
-	public String toString() {
-		StringBuilder sb = new StringBuilder(super.toString());
-		sb.append("; ");
-		sb.append(Mass.class.getSimpleName());
-		sb.append(": ");
-		sb.append(getMass());
-		sb.append("; ");
-		sb.append("Radius: ");
-		sb.append(getRadius());
-		sb.append("; ");
-		sb.append("Surface Gravity: ");
-		sb.append(surfaceGravity());
-		return sb.toString();
-	}
+/**
+ * Copyright (c) 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.examples.units.types;
+
+import static org.eclipse.uomo.units.SI.*;
+import static org.eclipse.uomo.units.SI.Prefix.KILO;
+import static org.eclipse.uomo.examples.units.types.SolarSystem.G;
+
+import org.eclipse.uomo.units.IMeasure;
+import org.eclipse.uomo.units.impl.quantity.AccelerationAmount;
+import org.eclipse.uomo.units.impl.quantity.LengthAmount;
+import org.eclipse.uomo.units.impl.quantity.MassAmount;
+import org.unitsofmeasurement.quantity.Acceleration;
+import org.unitsofmeasurement.quantity.Length;
+import org.unitsofmeasurement.quantity.Mass;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.0
+ * 
+ * This <type>enum</type> is inspired by Josh Bloch's example in <a href="http://www.oracle.com/technetwork/java/effectivejava-136174.html">Effective Java Second Edition</a>
+ * 
+ * <p>
+ * Suppose you want to add data and behavior to an enum. 
+ * For example consider <a href="http://en.wikipedia.org/wiki/Dwarf_planet">dwarf planets</a> of the <a href="http://en.wikipedia.org/wiki/Solar_System">solar system</a>. 
+ * Each planet knows its mass and radius, and can calculate its surface gravity and the weight of an object on the planet. 
+ * Here is how it looks:
+ * </p>
+ */
+public enum DwarfPlanet {
+	CERES(newMass(9.43e+20, KILOGRAM), newLength(0.4873e6, METRE)),
+    PLUTO(newMass(1.305e+22, KILOGRAM), newLength(1.153e6, METRE)),
+    HAUMEA(newMass(4.006e+21, KILOGRAM), newLength(620, KILO(METRE))),
+    MAKEMAKE(newMass(3e+21, KILOGRAM), newLength(715, KILO(METRE))),
+    ERIS(newMass(1.67e+22, KILOGRAM), newLength(1163, KILO(METRE)));
+
+    private final IMeasure<Mass> mass;   // in kilograms
+
+    private final IMeasure<Length> radius; // in meters
+
+    DwarfPlanet(IMeasure<Mass> mass, IMeasure<Length> radius) {
+        this.mass = mass;
+        this.radius = radius;
+    }
+
+    public IMeasure<Mass> getMass() {
+        return mass;
+    }
+
+    public IMeasure<Length> getRadius() {
+        return radius;
+    }
+
+    public Acceleration surfaceGravity() {
+        double m = mass.doubleValue(KILOGRAM);
+        double r = radius.doubleValue(METRE);
+        return new AccelerationAmount(
+                G * m / (r * r), METRES_PER_SQUARE_SECOND);
+    }
+
+    private static IMeasure<Mass> newMass(double value, Unit<Mass> unit) {
+        return new MassAmount(value, unit);
+    }
+
+    private static IMeasure<Length> newLength(double value, Unit<Length> unit) {
+        return new LengthAmount(value, unit);
+    }
+
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder(super.toString());
+		sb.append("; ");
+		sb.append(Mass.class.getSimpleName());
+		sb.append(": ");
+		sb.append(getMass());
+		sb.append("; ");
+		sb.append("Radius: ");
+		sb.append(getRadius());
+		sb.append("; ");
+		sb.append("Surface Gravity: ");
+		sb.append(surfaceGravity());
+		return sb.toString();
+	}
 }
\ No newline at end of file
diff --git a/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/types/Planet.java b/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/types/Planet.java
index 957c4b8..276cae7 100644
--- a/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/types/Planet.java
+++ b/examples/units/org.eclipse.uomo.examples.units.console/src/main/java/org/eclipse/uomo/examples/units/types/Planet.java
@@ -1,96 +1,96 @@
-/**
- * Copyright (c) 2005, 2013, Werner Keil and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Werner Keil - initial API and implementation
- */
-package org.eclipse.uomo.examples.units.types;
-
-import static org.eclipse.uomo.units.SI.*;
-import static org.eclipse.uomo.examples.units.types.SolarSystem.G;
-
-import org.eclipse.uomo.units.IMeasure;
-import org.eclipse.uomo.units.impl.quantity.AccelerationAmount;
-import org.eclipse.uomo.units.impl.quantity.LengthAmount;
-import org.eclipse.uomo.units.impl.quantity.MassAmount;
-import org.unitsofmeasurement.quantity.Acceleration;
-import org.unitsofmeasurement.quantity.Length;
-import org.unitsofmeasurement.quantity.Mass;
-import org.unitsofmeasurement.unit.Unit;
-
-/**
- * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
- * @version 1.0.2
- * 
- * This <type>enum</type> is inspired by Josh Bloch's example in <a href="http://www.oracle.com/technetwork/java/effectivejava-136174.html">Effective Java Second Edition</a>
- * 
- * <p>
- * Suppose you want to add data and behavior to an enum. 
- * For example consider <a href="http://en.wikipedia.org/wiki/Planet">planets</a> of the <a href="http://en.wikipedia.org/wiki/Solar_System">solar system</a>.  
- * Each planet knows its mass and radius, and can calculate its surface gravity and the weight of an object on the planet. 
- * Here is how it looks:
- * </p>
- */
-public enum Planet {
-
-    MERCURY(newMass(3.303e+23, KILOGRAM), newLength(2.4397e6, METRE)),
-    VENUS(newMass(4.869e+24, KILOGRAM), newLength(6.0518e6, METRE)),
-    EARTH(newMass(5.976e+24, KILOGRAM), newLength(6.37814e6, METRE)),
-    MARS(newMass(6.421e+23, KILOGRAM), newLength(3.3972e6, METRE)),
-    JUPITER(newMass(1.9e+27, KILOGRAM), newLength(7.1492e7, METRE)),
-    SATURN(newMass(5.688e+26, KILOGRAM), newLength(6.0268e7, METRE)),
-    URANUS(newMass(8.686e+25, KILOGRAM), newLength(2.5559e7, METRE)),
-    NEPTUNE(newMass(1.024e+26, KILOGRAM), newLength(2.4746e7, METRE));
-
-    private final IMeasure<Mass> mass;   // in kilograms
-
-    private final IMeasure<Length> radius; // in meters
-
-    Planet(IMeasure<Mass> mass, IMeasure<Length> radius) {
-        this.mass = mass;
-        this.radius = radius;
-    }
-
-    public IMeasure<Mass> getMass() {
-        return mass;
-    }
-
-    public IMeasure<Length> getRadius() {
-        return radius;
-    }
-
-    public Acceleration surfaceGravity() {
-        double m = mass.doubleValue(KILOGRAM);
-        double r = radius.doubleValue(METRE);
-        return new AccelerationAmount(
-                G * m / (r * r), METRES_PER_SQUARE_SECOND);
-    }
-
-    private static IMeasure<Mass> newMass(double value, Unit<Mass> unit) {
-        return new MassAmount(value, unit);
-    }
-
-    private static IMeasure<Length> newLength(double value, Unit<Length> unit) {
-        return new LengthAmount(value, unit);
-    }
-
-	@Override
-	public String toString() {
-		StringBuilder sb = new StringBuilder(super.toString());
-		sb.append("; ");
-		sb.append(Mass.class.getSimpleName());
-		sb.append(": ");
-		sb.append(getMass());
-		sb.append("; ");
-		sb.append(Messages.Planet_Radius);
-		sb.append(getRadius());
-		sb.append("; ");
-		sb.append("Surface Gravity: ");
-		sb.append(surfaceGravity());
-		return sb.toString();
-	}
+/**
+ * Copyright (c) 2005, 2013, Werner Keil and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Werner Keil - initial API and implementation
+ */
+package org.eclipse.uomo.examples.units.types;
+
+import static org.eclipse.uomo.units.SI.*;
+import static org.eclipse.uomo.examples.units.types.SolarSystem.G;
+
+import org.eclipse.uomo.units.IMeasure;
+import org.eclipse.uomo.units.impl.quantity.AccelerationAmount;
+import org.eclipse.uomo.units.impl.quantity.LengthAmount;
+import org.eclipse.uomo.units.impl.quantity.MassAmount;
+import org.unitsofmeasurement.quantity.Acceleration;
+import org.unitsofmeasurement.quantity.Length;
+import org.unitsofmeasurement.quantity.Mass;
+import org.unitsofmeasurement.unit.Unit;
+
+/**
+ * @author  <a href="mailto:uomo@catmedia.us">Werner Keil</a>
+ * @version 1.0.2
+ * 
+ * This <type>enum</type> is inspired by Josh Bloch's example in <a href="http://www.oracle.com/technetwork/java/effectivejava-136174.html">Effective Java Second Edition</a>
+ * 
+ * <p>
+ * Suppose you want to add data and behavior to an enum. 
+ * For example consider <a href="http://en.wikipedia.org/wiki/Planet">planets</a> of the <a href="http://en.wikipedia.org/wiki/Solar_System">solar system</a>.  
+ * Each planet knows its mass and radius, and can calculate its surface gravity and the weight of an object on the planet. 
+ * Here is how it looks:
+ * </p>
+ */
+public enum Planet {
+
+    MERCURY(newMass(3.303e+23, KILOGRAM), newLength(2.4397e6, METRE)),
+    VENUS(newMass(4.869e+24, KILOGRAM), newLength(6.0518e6, METRE)),
+    EARTH(newMass(5.976e+24, KILOGRAM), newLength(6.37814e6, METRE)),
+    MARS(newMass(6.421e+23, KILOGRAM), newLength(3.3972e6, METRE)),
+    JUPITER(newMass(1.9e+27, KILOGRAM), newLength(7.1492e7, METRE)),
+    SATURN(newMass(5.688e+26, KILOGRAM), newLength(6.0268e7, METRE)),
+    URANUS(newMass(8.686e+25, KILOGRAM), newLength(2.5559e7, METRE)),
+    NEPTUNE(newMass(1.024e+26, KILOGRAM), newLength(2.4746e7, METRE));
+
+    private final IMeasure<Mass> mass;   // in kilograms
+
+    private final IMeasure<Length> radius; // in meters
+
+    Planet(IMeasure<Mass> mass, IMeasure<Length> radius) {
+        this.mass = mass;
+        this.radius = radius;
+    }
+
+    public IMeasure<Mass> getMass() {
+        return mass;
+    }
+
+    public IMeasure<Length> getRadius() {
+        return radius;
+    }
+
+    public Acceleration surfaceGravity() {
+        double m = mass.doubleValue(KILOGRAM);
+        double r = radius.doubleValue(METRE);
+        return new AccelerationAmount(
+                G * m / (r * r), METRES_PER_SQUARE_SECOND);
+    }
+
+    private static IMeasure<Mass> newMass(double value, Unit<Mass> unit) {
+        return new MassAmount(value, unit);
+    }
+
+    private static IMeasure<Length> newLength(double value, Unit<Length> unit) {
+        return new LengthAmount(value, unit);
+    }
+
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder(super.toString());
+		sb.append("; ");
+		sb.append(Mass.class.getSimpleName());
+		sb.append(": ");
+		sb.append(getMass());
+		sb.append("; ");
+		sb.append(Messages.Planet_Radius);
+		sb.append(getRadius());
+		sb.append("; ");
+		sb.append("Surface Gravity: ");
+		sb.append(surfaceGravity());
+		return sb.toString();
+	}
 }
\ No newline at end of file
diff --git a/examples/units/org.eclipse.uomo.examples.units.console/src/main/resources/org/eclipse/uomo/examples/units/types/messages.properties b/examples/units/org.eclipse.uomo.examples.units.console/src/main/resources/org/eclipse/uomo/examples/units/types/messages.properties
index e4210f9..a5a1ce1 100644
--- a/examples/units/org.eclipse.uomo.examples.units.console/src/main/resources/org/eclipse/uomo/examples/units/types/messages.properties
+++ b/examples/units/org.eclipse.uomo.examples.units.console/src/main/resources/org/eclipse/uomo/examples/units/types/messages.properties
@@ -1,21 +1,21 @@
-#Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net)
-#
-# Copyright (c) 2005, 2013, Werner Keil and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Werner Keil - initial API and implementation
-#
-
-Planet_Radius = Radius:
-
-Planet_SurfaceWeight = Surface Weight:
-
-Planet_SurfaceGravity = Surface Gravity:
-
-Planet_Usage = Usage
-
+#Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net)
+#
+# Copyright (c) 2005, 2013, Werner Keil and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#    Werner Keil - initial API and implementation
+#
+
+Planet_Radius = Radius:
+
+Planet_SurfaceWeight = Surface Weight:
+
+Planet_SurfaceGravity = Surface Gravity:
+
+Planet_Usage = Usage
+
 BEAT = b
\ No newline at end of file
diff --git a/examples/units/org.eclipse.uomo.examples.units.pluginsample/.gitignore b/examples/units/org.eclipse.uomo.examples.units.pluginsample/.gitignore
index d90e434..c503453 100644
--- a/examples/units/org.eclipse.uomo.examples.units.pluginsample/.gitignore
+++ b/examples/units/org.eclipse.uomo.examples.units.pluginsample/.gitignore
@@ -1,2 +1,2 @@
-/.settings
-/target
+/.settings
+/target
diff --git a/examples/units/org.eclipse.uomo.examples.units.pluginsample/META-INF/MANIFEST.MF b/examples/units/org.eclipse.uomo.examples.units.pluginsample/META-INF/MANIFEST.MF
index e8594a8..7dc0f78 100644
--- a/examples/units/org.eclipse.uomo.examples.units.pluginsample/META-INF/MANIFEST.MF
+++ b/examples/units/org.eclipse.uomo.examples.units.pluginsample/META-INF/MANIFEST.MF
@@ -1,16 +1,16 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: UOMoPluginSample
-Bundle-SymbolicName: UOMoPluginSample; singleton:=true
-Bundle-Version: 0.1.0.SNAPSHOT
-Bundle-Activator: org.eclipse.uomo.examples.units.pluginsample.Activator
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.unitsofmeasurement.unit-api;bundle-version="0.7.0",
- org.eclipse.uomo.core;bundle-version="0.2.0",
- org.eclipse.uomo.units;bundle-version="0.5.0"
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5,
- OSGi/Minimum-1.1
-Export-Package: org.eclipse.uomo.examples.units.pluginsample,
- org.eclipse.uomo.examples.units.pluginsample.views
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: UOMoPluginSample
+Bundle-SymbolicName: UOMoPluginSample; singleton:=true
+Bundle-Version: 0.1.0.SNAPSHOT
+Bundle-Activator: org.eclipse.uomo.examples.units.pluginsample.Activator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.unitsofmeasurement.unit-api;bundle-version="0.7.0",
+ org.eclipse.uomo.core;bundle-version="0.2.0",
+ org.eclipse.uomo.units;bundle-version="0.5.0"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5,
+ OSGi/Minimum-1.1
+Export-Package: org.eclipse.uomo.examples.units.pluginsample,
+ org.eclipse.uomo.examples.units.pluginsample.views
diff --git a/examples/units/org.eclipse.uomo.examples.units.pluginsample/build.properties b/examples/units/org.eclipse.uomo.examples.units.pluginsample/build.properties
index 80bc250..ec21ee7 100644
--- a/examples/units/org.eclipse.uomo.examples.units.pluginsample/build.properties
+++ b/examples/units/org.eclipse.uomo.examples.units.pluginsample/build.properties
@@ -1,6 +1,6 @@
-source.. = src/main/java/,\
-           src/main/resources/,\
-           src/test/java/,\
-           src/test/resources/
-bin.includes = META-INF/,\
-               .
+source.. = src/main/java/,\
+           src/main/resources/,\
+           src/test/java/,\
+           src/test/resources/
+bin.includes = META-INF/,\
+               .
diff --git a/examples/units/org.eclipse.uomo.examples.units.pluginsample/contexts.xml b/examples/units/org.eclipse.uomo.examples.units.pluginsample/contexts.xml
index 02e26e4..f786995 100644
--- a/examples/units/org.eclipse.uomo.examples.units.pluginsample/contexts.xml
+++ b/examples/units/org.eclipse.uomo.examples.units.pluginsample/contexts.xml
@@ -1,12 +1,12 @@
-<contexts>
-	<context id="viewer" title="Sample View">
-		<description>This is the context help for the sample view with a table viewer. It was generated by a PDE template.</description>
-		<topic href="/PLUGINS_ROOT/org.eclipse.platform.doc.isv/guide/ua_help_context.htm" label="Context-sensitive help">
-			<enablement>
-				<with variable="platform">
-	            	<test property="org.eclipse.core.runtime.isBundleInstalled" args="org.eclipse.platform.doc.isv"/>
-	     		</with>
-			</enablement>
-		</topic>
-	</context>
-</contexts>
+<contexts>
+	<context id="viewer" title="Sample View">
+		<description>This is the context help for the sample view with a table viewer. It was generated by a PDE template.</description>
+		<topic href="/PLUGINS_ROOT/org.eclipse.platform.doc.isv/guide/ua_help_context.htm" label="Context-sensitive help">
+			<enablement>
+				<with variable="platform">
+	            	<test property="org.eclipse.core.runtime.isBundleInstalled" args="org.eclipse.platform.doc.isv"/>
+	     		</with>
+			</enablement>
+		</topic>
+	</context>
+</contexts>
diff --git a/examples/units/org.eclipse.uomo.examples.units.pluginsample/pom.xml b/examples/units/org.eclipse.uomo.examples.units.pluginsample/pom.xml
index 21931d2..37bc23c 100644
--- a/examples/units/org.eclipse.uomo.examples.units.pluginsample/pom.xml
+++ b/examples/units/org.eclipse.uomo.examples.units.pluginsample/pom.xml
@@ -1,32 +1,32 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <artifactId>org.eclipse.uomo.examples.units</artifactId>
-    <groupId>org.eclipse.uomo.examples</groupId>
-    <version>0.1.0.SNAPSHOT</version>
-  </parent>
-  <artifactId>org.eclipse.uomo.examples.units.pluginsample</artifactId>
-  <name>UOMo Units Plugin Sample</name>
-  <dependencies>
-  	<dependency>
-  		<groupId>org.eclipse.uomo</groupId>
-  		<artifactId>org.eclipse.uomo.core</artifactId>
-  		<version>0.2.0.SNAPSHOT</version>
-  		<scope>compile</scope>
-  	</dependency>
-  	<dependency>
-  		<groupId>org.unitsofmeasurement</groupId>
-  		<artifactId>unit-api</artifactId>
-  		<version>0.6.1</version>
-  		<type>bundle</type>
-  		<scope>compile</scope>
-  	</dependency>
-  	<dependency>
-  		<groupId>org.eclipse.uomo</groupId>
-  		<artifactId>org.eclipse.uomo.units</artifactId>
-  		<version>0.7.0.SNAPSHOT</version>
-  		<type>jar</type>
-  		<scope>compile</scope>
-  	</dependency>
-  </dependencies>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>org.eclipse.uomo.examples.units</artifactId>
+    <groupId>org.eclipse.uomo.examples</groupId>
+    <version>0.1.0.SNAPSHOT</version>
+  </parent>
+  <artifactId>org.eclipse.uomo.examples.units.pluginsample</artifactId>
+  <name>UOMo Units Plugin Sample</name>
+  <dependencies>
+  	<dependency>
+  		<groupId>org.eclipse.uomo</groupId>
+  		<artifactId>org.eclipse.uomo.core</artifactId>
+  		<version>0.2.0.SNAPSHOT</version>
+  		<scope>compile</scope>
+  	</dependency>
+  	<dependency>
+  		<groupId>org.unitsofmeasurement</groupId>
+  		<artifactId>unit-api</artifactId>
+  		<version>0.6.1</version>
+  		<type>bundle</type>
+  		<scope>compile</scope>
+  	</dependency>
+  	<dependency>
+  		<groupId>org.eclipse.uomo</groupId>
+  		<artifactId>org.eclipse.uomo.units</artifactId>
+  		<version>0.7.0.SNAPSHOT</version>
+  		<type>jar</type>
+  		<scope>compile</scope>
+  	</dependency>
+  </dependencies>
 </project>
\ No newline at end of file
diff --git a/examples/units/org.eclipse.uomo.examples.units.pluginsample/src/main/java/org/eclipse/uomo/examples/units/pluginsample/views/SampleView.java b/examples/units/org.eclipse.uomo.examples.units.pluginsample/src/main/java/org/eclipse/uomo/examples/units/pluginsample/views/SampleView.java
index cd05dac..3415751 100644
--- a/examples/units/org.eclipse.uomo.examples.units.pluginsample/src/main/java/org/eclipse/uomo/examples/units/pluginsample/views/SampleView.java
+++ b/examples/units/org.eclipse.uomo.examples.units.pluginsample/src/main/java/org/eclipse/uomo/examples/units/pluginsample/views/SampleView.java
@@ -1,199 +1,199 @@
-package org.eclipse.uomo.examples.units.pluginsample.views;
-
-import static org.eclipse.uomo.units.SI.*;
-import static org.eclipse.uomo.units.impl.system.USCustomary.LITER;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.part.*;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.jface.action.*;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.ui.*;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.SWT;
-
-import org.eclipse.uomo.units.impl.quantity.*;
-
-/**
- * This sample class demonstrates how to plug-in a new
- * workbench view. The view shows data obtained from the
- * model. The sample creates a dummy model on the fly,
- * but a real implementation would connect to the model
- * available either in this or another plug-in (e.g. the workspace).
- * The view is connected to the model using a content provider.
- * <p>
- * The view uses a label provider to define how model
- * objects should be presented in the view. Each
- * view can present the same model objects using
- * different labels and icons, if needed. Alternatively,
- * a single label provider can be shared between views
- * in order to ensure that objects of the same type are
- * presented in the same way everywhere.
- * <p>
- */
-
-public class SampleView extends ViewPart {
-
-	/**
-	 * The ID of the view as specified by the extension.
-	 */
-	public static final String ID = "uomopluginsample.views.SampleView";
-
-	private TableViewer viewer;
-	private Action action1;
-	private Action action2;
-	private Action doubleClickAction;
-	private final LengthAmount length;
-	private final MassAmount mass;
-	private final VolumeAmount volume;
-	
-	/*
-	 * The content provider class is responsible for
-	 * providing objects to the view. It can wrap
-	 * existing objects in adapters or simply return
-	 * objects as-is. These objects may be sensitive
-	 * to the current input of the view, or ignore
-	 * it and always show the same content 
-	 * (like Task List, for example).
-	 */
-	 
-	class ViewContentProvider implements IStructuredContentProvider {
-		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
-		}
-		public void dispose() {
-		}
-		public Object[] getElements(Object parent) {
-			return new Object[] { length, mass, volume };
-		}
-	}
-	class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {
-		public String getColumnText(Object obj, int index) {
-			return getText(obj);
-		}
-		public Image getColumnImage(Object obj, int index) {
-			return getImage(obj);
-		}
-		public Image getImage(Object obj) {
-			return PlatformUI.getWorkbench().
-					getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
-		}
-	}
-	class NameSorter extends ViewerSorter {
-	}
-
-	/**
-	 * The constructor.
-	 */
-	public SampleView() {
-		length = new LengthAmount(1,METRE);
-		mass = new MassAmount(2, KILOGRAM);
-		volume = new VolumeAmount(3, LITER);
-	}
-
-	/**
-	 * This is a callback that will allow us
-	 * to create the viewer and initialize it.
-	 */
-	public void createPartControl(Composite parent) {
-		viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-		viewer.setContentProvider(new ViewContentProvider());
-		viewer.setLabelProvider(new ViewLabelProvider());
-		viewer.setSorter(new NameSorter());
-		viewer.setInput(getViewSite());
-
-		// Create the help context id for the viewer's control
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), "UOMoPluginSample.viewer");
-		makeActions();
-		hookContextMenu();
-		hookDoubleClickAction();
-		contributeToActionBars();
-	}
-
-	private void hookContextMenu() {
-		MenuManager menuMgr = new MenuManager("#PopupMenu");
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				SampleView.this.fillContextMenu(manager);
-			}
-		});
-		Menu menu = menuMgr.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-		getSite().registerContextMenu(menuMgr, viewer);
-	}
-
-	private void contributeToActionBars() {
-		IActionBars bars = getViewSite().getActionBars();
-		fillLocalPullDown(bars.getMenuManager());
-		fillLocalToolBar(bars.getToolBarManager());
-	}
-
-	private void fillLocalPullDown(IMenuManager manager) {
-		manager.add(action1);
-		manager.add(new Separator());
-		manager.add(action2);
-	}
-
-	private void fillContextMenu(IMenuManager manager) {
-		manager.add(action1);
-		manager.add(action2);
-		// Other plug-ins can contribute there actions here
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-	
-	private void fillLocalToolBar(IToolBarManager manager) {
-		manager.add(action1);
-		manager.add(action2);
-	}
-
-	private void makeActions() {
-		action1 = new Action() {
-			public void run() {
-				showMessage("Action 1 executed");
-			}
-		};
-		action1.setText("Action 1");
-		action1.setToolTipText("Action 1 tooltip");
-		action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
-			getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
-		
-		action2 = new Action() {
-			public void run() {
-				showMessage("Action 2 executed");
-			}
-		};
-		action2.setText("Action 2");
-		action2.setToolTipText("Action 2 tooltip");
-		action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
-				getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
-		doubleClickAction = new Action() {
-			public void run() {
-				ISelection selection = viewer.getSelection();
-				Object obj = ((IStructuredSelection)selection).getFirstElement();
-				showMessage("Double-click detected on "+obj.toString());
-			}
-		};
-	}
-
-	private void hookDoubleClickAction() {
-		viewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				doubleClickAction.run();
-			}
-		});
-	}
-	private void showMessage(String message) {
-		MessageDialog.openInformation(
-			viewer.getControl().getShell(),
-			"Sample View",
-			message);
-	}
-
-	/**
-	 * Passing the focus request to the viewer's control.
-	 */
-	public void setFocus() {
-		viewer.getControl().setFocus();
-	}
+package org.eclipse.uomo.examples.units.pluginsample.views;
+
+import static org.eclipse.uomo.units.SI.*;
+import static org.eclipse.uomo.units.impl.system.USCustomary.LITER;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.part.*;
+import org.eclipse.jface.viewers.*;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.jface.action.*;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.ui.*;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.SWT;
+
+import org.eclipse.uomo.units.impl.quantity.*;
+
+/**
+ * This sample class demonstrates how to plug-in a new
+ * workbench view. The view shows data obtained from the
+ * model. The sample creates a dummy model on the fly,
+ * but a real implementation would connect to the model
+ * available either in this or another plug-in (e.g. the workspace).
+ * The view is connected to the model using a content provider.
+ * <p>
+ * The view uses a label provider to define how model
+ * objects should be presented in the view. Each
+ * view can present the same model objects using
+ * different labels and icons, if needed. Alternatively,
+ * a single label provider can be shared between views
+ * in order to ensure that objects of the same type are
+ * presented in the same way everywhere.
+ * <p>
+ */
+
+public class SampleView extends ViewPart {
+
+	/**
+	 * The ID of the view as specified by the extension.
+	 */
+	public static final String ID = "uomopluginsample.views.SampleView";
+
+	private TableViewer viewer;
+	private Action action1;
+	private Action action2;
+	private Action doubleClickAction;
+	private final LengthAmount length;
+	private final MassAmount mass;
+	private final VolumeAmount volume;
+	
+	/*
+	 * The content provider class is responsible for
+	 * providing objects to the view. It can wrap
+	 * existing objects in adapters or simply return
+	 * objects as-is. These objects may be sensitive
+	 * to the current input of the view, or ignore
+	 * it and always show the same content 
+	 * (like Task List, for example).
+	 */
+	 
+	class ViewContentProvider implements IStructuredContentProvider {
+		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+		}
+		public void dispose() {
+		}
+		public Object[] getElements(Object parent) {
+			return new Object[] { length, mass, volume };
+		}
+	}
+	class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {
+		public String getColumnText(Object obj, int index) {
+			return getText(obj);
+		}
+		public Image getColumnImage(Object obj, int index) {
+			return getImage(obj);
+		}
+		public Image getImage(Object obj) {
+			return PlatformUI.getWorkbench().
+					getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
+		}
+	}
+	class NameSorter extends ViewerSorter {
+	}
+
+	/**
+	 * The constructor.
+	 */
+	public SampleView() {
+		length = new LengthAmount(1,METRE);
+		mass = new MassAmount(2, KILOGRAM);
+		volume = new VolumeAmount(3, LITER);
+	}
+
+	/**
+	 * This is a callback that will allow us
+	 * to create the viewer and initialize it.
+	 */
+	public void createPartControl(Composite parent) {
+		viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+		viewer.setContentProvider(new ViewContentProvider());
+		viewer.setLabelProvider(new ViewLabelProvider());
+		viewer.setSorter(new NameSorter());
+		viewer.setInput(getViewSite());
+
+		// Create the help context id for the viewer's control
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), "UOMoPluginSample.viewer");
+		makeActions();
+		hookContextMenu();
+		hookDoubleClickAction();
+		contributeToActionBars();
+	}
+
+	private void hookContextMenu() {
+		MenuManager menuMgr = new MenuManager("#PopupMenu");
+		menuMgr.setRemoveAllWhenShown(true);
+		menuMgr.addMenuListener(new IMenuListener() {
+			public void menuAboutToShow(IMenuManager manager) {
+				SampleView.this.fillContextMenu(manager);
+			}
+		});
+		Menu menu = menuMgr.createContextMenu(viewer.getControl());
+		viewer.getControl().setMenu(menu);
+		getSite().registerContextMenu(menuMgr, viewer);
+	}
+
+	private void contributeToActionBars() {
+		IActionBars bars = getViewSite().getActionBars();
+		fillLocalPullDown(bars.getMenuManager());
+		fillLocalToolBar(bars.getToolBarManager());
+	}
+
+	private void fillLocalPullDown(IMenuManager manager) {
+		manager.add(action1);
+		manager.add(new Separator());
+		manager.add(action2);
+	}
+
+	private void fillContextMenu(IMenuManager manager) {
+		manager.add(action1);
+		manager.add(action2);
+		// Other plug-ins can contribute there actions here
+		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+	}
+	
+	private void fillLocalToolBar(IToolBarManager manager) {
+		manager.add(action1);
+		manager.add(action2);
+	}
+
+	private void makeActions() {
+		action1 = new Action() {
+			public void run() {
+				showMessage("Action 1 executed");
+			}
+		};
+		action1.setText("Action 1");
+		action1.setToolTipText("Action 1 tooltip");
+		action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
+			getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
+		
+		action2 = new Action() {
+			public void run() {
+				showMessage("Action 2 executed");
+			}
+		};
+		action2.setText("Action 2");
+		action2.setToolTipText("Action 2 tooltip");
+		action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
+				getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
+		doubleClickAction = new Action() {
+			public void run() {
+				ISelection selection = viewer.getSelection();
+				Object obj = ((IStructuredSelection)selection).getFirstElement();
+				showMessage("Double-click detected on "+obj.toString());
+			}
+		};
+	}
+
+	private void hookDoubleClickAction() {
+		viewer.addDoubleClickListener(new IDoubleClickListener() {
+			public void doubleClick(DoubleClickEvent event) {
+				doubleClickAction.run();
+			}
+		});
+	}
+	private void showMessage(String message) {
+		MessageDialog.openInformation(
+			viewer.getControl().getShell(),
+			"Sample View",
+			message);
+	}
+
+	/**
+	 * Passing the focus request to the viewer's control.
+	 */
+	public void setFocus() {
+		viewer.getControl().setFocus();
+	}
 }
\ No newline at end of file
diff --git a/examples/units/pom.xml b/examples/units/pom.xml
index a5423d5..290c382 100644
--- a/examples/units/pom.xml
+++ b/examples/units/pom.xml
@@ -1,37 +1,37 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<artifactId>org.eclipse.uomo.examples</artifactId>
-		<groupId>org.eclipse.uomo</groupId>
-		<version>0.7.0-SNAPSHOT</version>
-	</parent>
-	<artifactId>org.eclipse.uomo.examples.units</artifactId>
-	<packaging>pom</packaging>
-	<name>Eclipse UOMo Units Examples</name>
-	<modules>
-	   <module>org.eclipse.uomo.examples.units.console</module>
-	   <!--  >module>org.eclipse.uomo.examples.units.pluginsample</module -->
-    <module>org.eclipse.uomo.examples.units.android</module>
-  </modules>
-	<!-- ==================================================== -->
-    <!-- Repositories. This is where Maven looks for dependencies. 
-         The Maven repository is implicit and doesn't need 
-         to be specified. -->
-    <!-- ==================================================== -->
-    <repositories>
-        <repository>
-            <id>maven-geotoolkit.org</id>
-            <name>GeoToolkit Repository for Maven</name>
-            <url>http://maven.geotoolkit.org/</url>
-        </repository>
-        
-        <repository>
-            <id>OpenL10n</id>
-            <name>Openl10.net</name>
-            <url>http://nexus.openl10n.net/content/groups/public/</url>
-        </repository>
-    </repositories>
-	
-    <groupId>org.eclipse.uomo.examples.units</groupId>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<artifactId>org.eclipse.uomo.examples</artifactId>
+		<groupId>org.eclipse.uomo</groupId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.uomo.examples.units</artifactId>
+	<packaging>pom</packaging>
+	<name>Eclipse UOMo Units Examples</name>
+	<modules>
+	   <module>org.eclipse.uomo.examples.units.console</module>
+	   <!--  >module>org.eclipse.uomo.examples.units.pluginsample</module -->
+    <module>org.eclipse.uomo.examples.units.android</module>
+  </modules>
+	<!-- ==================================================== -->
+    <!-- Repositories. This is where Maven looks for dependencies. 
+         The Maven repository is implicit and doesn't need 
+         to be specified. -->
+    <!-- ==================================================== -->
+    <repositories>
+        <repository>
+            <id>maven-geotoolkit.org</id>
+            <name>GeoToolkit Repository for Maven</name>
+            <url>http://maven.geotoolkit.org/</url>
+        </repository>
+        
+        <repository>
+            <id>OpenL10n</id>
+            <name>Openl10.net</name>
+            <url>http://nexus.openl10n.net/content/groups/public/</url>
+        </repository>
+    </repositories>
+	
+    <groupId>org.eclipse.uomo.examples.units</groupId>
 </project>
\ No newline at end of file
diff --git a/features/.gitignore b/features/.gitignore
index 834befa..95cea85 100644
--- a/features/.gitignore
+++ b/features/.gitignore
@@ -1,3 +1,3 @@
-/src
-/.settings
-/target
+/src
+/.settings
+/target
diff --git a/features/org.eclipse.uomo.feature/.gitignore b/features/org.eclipse.uomo.feature/.gitignore
index e7da900..1a315ce 100644
--- a/features/org.eclipse.uomo.feature/.gitignore
+++ b/features/org.eclipse.uomo.feature/.gitignore
@@ -1,3 +1,3 @@
-/target
-/.settings
-/target
+/target
+/.settings
+/target
diff --git a/features/org.eclipse.uomo.feature/.project b/features/org.eclipse.uomo.feature/.project
index 2511082..09dd5a1 100644
--- a/features/org.eclipse.uomo.feature/.project
+++ b/features/org.eclipse.uomo.feature/.project
@@ -1,41 +1,41 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.uomo.feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.wst.common.project.facet.core.builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.maven.ide.eclipse.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.maven.ide.eclipse.maven2Nature</nature>
-		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.uomo.feature</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.maven.ide.eclipse.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.FeatureBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.maven.ide.eclipse.maven2Nature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+		<nature>org.eclipse.pde.FeatureNature</nature>
+	</natures>
+</projectDescription>
diff --git a/features/org.eclipse.uomo.feature/feature.xml b/features/org.eclipse.uomo.feature/feature.xml
index b378ce8..069828d 100644
--- a/features/org.eclipse.uomo.feature/feature.xml
+++ b/features/org.eclipse.uomo.feature/feature.xml
@@ -1,206 +1,206 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.uomo.feature"
-      label="Eclipse UOMo"
-      version="0.7.0.qualifier"
-      provider-name="Eclipse.org"
-      plugin="org.eclipse.uomo.ui">
-
-   <description url="http://www.eclipse.org/uomo">
-      Eclipse UOMo
-   </description>
-
-   <copyright url="http://www.example.com/copyright">
-      Eclipse Foundation Software User Agreement
-
-February 1, 2011
-
-Usage Of Content
-
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY &quot;CONTENT&quot;). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.
-
-Applicable Licenses
-
-Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 (&quot;EPL&quot;). A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, &quot;Program&quot; will mean the Content.
-
-Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).
-
-Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).
-Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named &quot;plugins&quot;.
-A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;. Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins and/or Fragments associated with that Feature.
-Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.
-The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;). Abouts and Feature Licenses may be located in any directory of a Download or Module including, but not limited to the following locations:
-
-The top-level (root) directory
-Plug-in and Fragment directories
-Inside Plug-ins and Fragments packaged as JARs
-Sub-directories of the directory named &quot;src&quot; of certain Plug-ins
-Feature directories
-Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or inform you where you can locate them. Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature. Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in that directory.
-
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):
-
-Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)
-Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)
-Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)
-Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)
-Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)
-Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.
-
-Use of Provisioning Technology
-
-The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to install, extend and update Eclipse-based products. Information about packaging Installable Software is available at http://eclipse.org/equinox/p2/repository_packaging.html (&quot;Specification&quot;).
-
-You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:
-
-A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based product.
-During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be accessed and copied to the Target Machine.
-Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.
-Cryptography
-
-Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check the country&apos;s laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.
-
-Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.
-   </copyright>
-
-   <license url="http://www.eclipse.org/legal/epl-v10.html">
-      Eclipse Public License - v 1.0
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT&apos;S ACCEPTANCE OF THIS AGREEMENT.
-
-1. DEFINITIONS
-
-&quot;Contribution&quot; means:
-
-a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
-b) in the case of each subsequent Contributor:
-i) changes to the Program, and
-ii) additions to the Program;
-where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution &apos;originates&apos; from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor&apos;s behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
-&quot;Contributor&quot; means any person or entity that distributes the Program.
-
-&quot;Licensed Patents&quot; mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
-
-&quot;Program&quot; means the Contributions distributed in accordance with this Agreement.
-
-&quot;Recipient&quot; means anyone who receives the Program under this Agreement, including all Contributors.
-
-2. GRANT OF RIGHTS
-
-a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
-b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
-c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient&apos;s responsibility to acquire that license before distributing the Program.
-d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
-3. REQUIREMENTS
-
-A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
-
-a) it complies with the terms and conditions of this Agreement; and
-b) its license agreement:
-i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
-ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
-iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
-iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
-When the Program is made available in source code form:
-
-a) it must be made available under this Agreement; and
-b) a copy of this Agreement must be included with each copy of the Program.
-Contributors may not remove or alter any copyright notices contained within the Program.
-
-Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
-
-4. COMMERCIAL DISTRIBUTION
-
-Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor (&quot;Commercial Contributor&quot;) hereby agrees to defend and indemnify every other Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor&apos;s responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
-
-5. NO WARRANTY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
-
-6. DISCLAIMER OF LIABILITY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. GENERAL
-
-If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient&apos;s patent(s), then such Recipient&apos;s rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
-
-All Recipient&apos;s rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient&apos;s rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient&apos;s obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
-
-This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
-   </license>
-
-   <url>
-      <update label="Eclipse UOMo Updates" url="http://www.eclipse.org/uomo/update"/>
-   </url>
-
-   <requires>
-      <import plugin="com.ibm.icu" version="4.2.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.uomo.core" version="0.7.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.uomo.core" version="0.7.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.uomo.util" version="0.7.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.uomo.xml" version="0.7.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.uomo.units" version="0.7.0" match="greaterOrEqual"/>
-      
-      <import plugin="org.eclipse.core.runtime" version="3.6.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.osgi" version="3.6.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.osgi.services" version="3.2.100" match="greaterOrEqual"/>
-   </requires>
-
-   <plugin
-         id="org.eclipse.uomo.units"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.uomo.util"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.uomo.xml"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.uomo.ucum"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.uomo.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.uomo.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.commons.lang"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.uomo.feature"
+      label="Eclipse UOMo"
+      version="0.7.0.qualifier"
+      provider-name="Eclipse.org"
+      plugin="org.eclipse.uomo.ui">
+
+   <description url="http://www.eclipse.org/uomo">
+      Eclipse UOMo
+   </description>
+
+   <copyright url="http://www.example.com/copyright">
+      Eclipse Foundation Software User Agreement
+
+February 1, 2011
+
+Usage Of Content
+
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY &quot;CONTENT&quot;). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.
+
+Applicable Licenses
+
+Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 (&quot;EPL&quot;). A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, &quot;Program&quot; will mean the Content.
+
+Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).
+
+Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).
+Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named &quot;plugins&quot;.
+A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;. Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins and/or Fragments associated with that Feature.
+Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.
+The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;). Abouts and Feature Licenses may be located in any directory of a Download or Module including, but not limited to the following locations:
+
+The top-level (root) directory
+Plug-in and Fragment directories
+Inside Plug-ins and Fragments packaged as JARs
+Sub-directories of the directory named &quot;src&quot; of certain Plug-ins
+Feature directories
+Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or inform you where you can locate them. Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature. Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in that directory.
+
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):
+
+Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)
+Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)
+Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)
+Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)
+Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)
+Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.
+
+Use of Provisioning Technology
+
+The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to install, extend and update Eclipse-based products. Information about packaging Installable Software is available at http://eclipse.org/equinox/p2/repository_packaging.html (&quot;Specification&quot;).
+
+You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:
+
+A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based product.
+During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be accessed and copied to the Target Machine.
+Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.
+Cryptography
+
+Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check the country&apos;s laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.
+
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.
+   </copyright>
+
+   <license url="http://www.eclipse.org/legal/epl-v10.html">
+      Eclipse Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT&apos;S ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+&quot;Contribution&quot; means:
+
+a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
+b) in the case of each subsequent Contributor:
+i) changes to the Program, and
+ii) additions to the Program;
+where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution &apos;originates&apos; from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor&apos;s behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
+&quot;Contributor&quot; means any person or entity that distributes the Program.
+
+&quot;Licensed Patents&quot; mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
+
+&quot;Program&quot; means the Contributions distributed in accordance with this Agreement.
+
+&quot;Recipient&quot; means anyone who receives the Program under this Agreement, including all Contributors.
+
+2. GRANT OF RIGHTS
+
+a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
+b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
+c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient&apos;s responsibility to acquire that license before distributing the Program.
+d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
+
+a) it complies with the terms and conditions of this Agreement; and
+b) its license agreement:
+i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
+ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
+iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
+iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
+When the Program is made available in source code form:
+
+a) it must be made available under this Agreement; and
+b) a copy of this Agreement must be included with each copy of the Program.
+Contributors may not remove or alter any copyright notices contained within the Program.
+
+Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor (&quot;Commercial Contributor&quot;) hereby agrees to defend and indemnify every other Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor&apos;s responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient&apos;s patent(s), then such Recipient&apos;s rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
+
+All Recipient&apos;s rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient&apos;s rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient&apos;s obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
+   </license>
+
+   <url>
+      <update label="Eclipse UOMo Updates" url="http://www.eclipse.org/uomo/update"/>
+   </url>
+
+   <requires>
+      <import plugin="com.ibm.icu" version="4.2.0" match="greaterOrEqual"/>
+      <import plugin="org.eclipse.uomo.core" version="0.7.0" match="greaterOrEqual"/>
+      <import plugin="org.eclipse.uomo.core" version="0.7.0" match="greaterOrEqual"/>
+      <import plugin="org.eclipse.uomo.util" version="0.7.0" match="greaterOrEqual"/>
+      <import plugin="org.eclipse.uomo.xml" version="0.7.0" match="greaterOrEqual"/>
+      <import plugin="org.eclipse.uomo.units" version="0.7.0" match="greaterOrEqual"/>
+      
+      <import plugin="org.eclipse.core.runtime" version="3.6.0" match="greaterOrEqual"/>
+      <import plugin="org.eclipse.osgi" version="3.6.0" match="greaterOrEqual"/>
+      <import plugin="org.eclipse.osgi.services" version="3.2.100" match="greaterOrEqual"/>
+   </requires>
+
+   <plugin
+         id="org.eclipse.uomo.units"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.uomo.util"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.uomo.xml"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.uomo.ucum"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.uomo.core"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.uomo.ui"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.apache.commons.lang"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
diff --git a/features/org.eclipse.uomo.feature/pom.xml b/features/org.eclipse.uomo.feature/pom.xml
index 6afa293..a6c2f69 100644
--- a/features/org.eclipse.uomo.feature/pom.xml
+++ b/features/org.eclipse.uomo.feature/pom.xml
@@ -1,13 +1,13 @@
-<?xml version="1.0"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <artifactId>org.eclipse.uomo.features</artifactId>
-    <groupId>org.eclipse.uomo</groupId>
-    <version>0.7.0-SNAPSHOT</version>
-  </parent>
-  <packaging>eclipse-feature</packaging>
-  <artifactId>org.eclipse.uomo.feature</artifactId>
-  <name>UOMo Feature</name>
-</project>
+<?xml version="1.0"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>org.eclipse.uomo.features</artifactId>
+    <groupId>org.eclipse.uomo</groupId>
+    <version>0.7.0-SNAPSHOT</version>
+  </parent>
+  <packaging>eclipse-feature</packaging>
+  <artifactId>org.eclipse.uomo.feature</artifactId>
+  <name>UOMo Feature</name>
+</project>
diff --git a/features/pom.xml b/features/pom.xml
index d8f9848..ae69d95 100644
--- a/features/pom.xml
+++ b/features/pom.xml
@@ -1,14 +1,14 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <artifactId>org.eclipse.uomo</artifactId>
-    <groupId>org.eclipse.uomo</groupId>
-    <version>0.7.0-SNAPSHOT</version>
-  </parent>
-  <artifactId>org.eclipse.uomo.features</artifactId>
-  <name>Eclipse UOMo Features</name>
-  <packaging>pom</packaging>
-  <modules>
-  	<module>org.eclipse.uomo.feature</module>
-  </modules>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>org.eclipse.uomo</artifactId>
+    <groupId>org.eclipse.uomo</groupId>
+    <version>0.7.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>org.eclipse.uomo.features</artifactId>
+  <name>Eclipse UOMo Features</name>
+  <packaging>pom</packaging>
+  <modules>
+  	<module>org.eclipse.uomo.feature</module>
+  </modules>
 </project>
\ No newline at end of file
diff --git a/maven/Maven Clean Install.launch b/maven/Maven Clean Install.launch
index f2a7d03..af66048 100644
--- a/maven/Maven Clean Install.launch
+++ b/maven/Maven Clean Install.launch
@@ -1,22 +1,22 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType">
-<booleanAttribute key="M2_DEBUG_OUTPUT" value="false"/>
-<stringAttribute key="M2_GOALS" value="clean install"/>
-<booleanAttribute key="M2_NON_RECURSIVE" value="false"/>
-<booleanAttribute key="M2_OFFLINE" value="false"/>
-<stringAttribute key="M2_PROFILES" value=""/>
-<listAttribute key="M2_PROPERTIES"/>
-<stringAttribute key="M2_RUNTIME" value="apache-maven-3.0.4"/>
-<booleanAttribute key="M2_SKIP_TESTS" value="true"/>
-<intAttribute key="M2_THREADS" value="1"/>
-<booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/>
-<stringAttribute key="M2_USER_SETTINGS" value=""/>
-<booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="false"/>
-<stringAttribute key="org.eclipse.debug.ui.ATTR_CONSOLE_ENCODING" value="UTF-8"/>
-<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
-<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dmaven.test.skip=true"/>
-<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc:/org.eclipse.uomo}"/>
-</launchConfiguration>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType">
+<booleanAttribute key="M2_DEBUG_OUTPUT" value="false"/>
+<stringAttribute key="M2_GOALS" value="clean install"/>
+<booleanAttribute key="M2_NON_RECURSIVE" value="false"/>
+<booleanAttribute key="M2_OFFLINE" value="false"/>
+<stringAttribute key="M2_PROFILES" value=""/>
+<listAttribute key="M2_PROPERTIES"/>
+<stringAttribute key="M2_RUNTIME" value="apache-maven-3.0.4"/>
+<booleanAttribute key="M2_SKIP_TESTS" value="true"/>
+<intAttribute key="M2_THREADS" value="1"/>
+<booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/>
+<stringAttribute key="M2_USER_SETTINGS" value=""/>
+<booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="false"/>
+<stringAttribute key="org.eclipse.debug.ui.ATTR_CONSOLE_ENCODING" value="UTF-8"/>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dmaven.test.skip=true"/>
+<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc:/org.eclipse.uomo}"/>
+</launchConfiguration>
diff --git a/maven/Maven Clean Package.launch b/maven/Maven Clean Package.launch
index 69a1f4e..3f2c231 100644
--- a/maven/Maven Clean Package.launch
+++ b/maven/Maven Clean Package.launch
@@ -1,21 +1,21 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType">
-<booleanAttribute key="M2_DEBUG_OUTPUT" value="false"/>
-<stringAttribute key="M2_GOALS" value="clean package"/>
-<booleanAttribute key="M2_NON_RECURSIVE" value="false"/>
-<booleanAttribute key="M2_OFFLINE" value="false"/>
-<stringAttribute key="M2_PROFILES" value=""/>
-<listAttribute key="M2_PROPERTIES"/>
-<stringAttribute key="M2_RUNTIME" value="apache-maven-3.0.4"/>
-<booleanAttribute key="M2_SKIP_TESTS" value="true"/>
-<intAttribute key="M2_THREADS" value="1"/>
-<booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/>
-<stringAttribute key="M2_USER_SETTINGS" value=""/>
-<booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="false"/>
-<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
-<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dmaven.test.skip=true"/>
-<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc:/org.eclipse.uomo}"/>
-</launchConfiguration>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType">
+<booleanAttribute key="M2_DEBUG_OUTPUT" value="false"/>
+<stringAttribute key="M2_GOALS" value="clean package"/>
+<booleanAttribute key="M2_NON_RECURSIVE" value="false"/>
+<booleanAttribute key="M2_OFFLINE" value="false"/>
+<stringAttribute key="M2_PROFILES" value=""/>
+<listAttribute key="M2_PROPERTIES"/>
+<stringAttribute key="M2_RUNTIME" value="apache-maven-3.0.4"/>
+<booleanAttribute key="M2_SKIP_TESTS" value="true"/>
+<intAttribute key="M2_THREADS" value="1"/>
+<booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/>
+<stringAttribute key="M2_USER_SETTINGS" value=""/>
+<booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="false"/>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dmaven.test.skip=true"/>
+<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc:/org.eclipse.uomo}"/>
+</launchConfiguration>
diff --git a/maven/Maven Install.launch b/maven/Maven Install.launch
index efeffc8..aa84b3b 100644
--- a/maven/Maven Install.launch
+++ b/maven/Maven Install.launch
@@ -1,16 +1,16 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType">
-<booleanAttribute key="M2_DEBUG_OUTPUT" value="false"/>
-<stringAttribute key="M2_GOALS" value="install"/>
-<booleanAttribute key="M2_NON_RECURSIVE" value="false"/>
-<booleanAttribute key="M2_OFFLINE" value="false"/>
-<stringAttribute key="M2_PROFILES" value=""/>
-<listAttribute key="M2_PROPERTIES"/>
-<stringAttribute key="M2_RUNTIME" value="EMBEDDED"/>
-<booleanAttribute key="M2_SKIP_TESTS" value="true"/>
-<intAttribute key="M2_THREADS" value="1"/>
-<booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/>
-<stringAttribute key="M2_USER_SETTINGS" value=""/>
-<booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="false"/>
-<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc:/org.eclipse.uomo}"/>
-</launchConfiguration>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType">
+<booleanAttribute key="M2_DEBUG_OUTPUT" value="false"/>
+<stringAttribute key="M2_GOALS" value="install"/>
+<booleanAttribute key="M2_NON_RECURSIVE" value="false"/>
+<booleanAttribute key="M2_OFFLINE" value="false"/>
+<stringAttribute key="M2_PROFILES" value=""/>
+<listAttribute key="M2_PROPERTIES"/>
+<stringAttribute key="M2_RUNTIME" value="EMBEDDED"/>
+<booleanAttribute key="M2_SKIP_TESTS" value="true"/>
+<intAttribute key="M2_THREADS" value="1"/>
+<booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/>
+<stringAttribute key="M2_USER_SETTINGS" value=""/>
+<booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc:/org.eclipse.uomo}"/>
+</launchConfiguration>
diff --git a/pom.xml b/pom.xml
index e3e3057..8f355a5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,209 +1,209 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- ======================================================================= 
-	Maven Project Configuration File Eclipse UOMo http://www.eclipse.org/proposals/uomo/ 
-	======================================================================= -->
-
-<!-- $Id: pom.xml 306 2012-10-29 20:42:27Z werner.keil $ -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<parent>
-		<!-- 
-		<artifactId>eclipse-parent</artifactId>
-		<groupId>org.eclipse</groupId>
-		<version>1.0.0</version>
- -->
-		<groupId>org.sonatype.oss</groupId>
-		<artifactId>oss-parent</artifactId>
-		<version>9</version>
-	</parent>
-	
-	<modelVersion>4.0.0</modelVersion>
-	<properties>
-		<sourceEncoding>UTF-8</sourceEncoding> <!-- in Maven 3. -->
-		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-		<project.build.javaVersion>1.6</project.build.javaVersion>
-		<maven.compilerPlugin.version>2.3.2</maven.compilerPlugin.version>
-		<uomo-version>0.7.0-SNAPSHOT</uomo-version>
-		<tycho-version>0.16.0</tycho-version>
-		<icu4j-version>50.1.1</icu4j-version>
-		<maven.compiler.source>1.6</maven.compiler.source>
-		<maven.compiler.target>1.6</maven.compiler.target>
-		<site.basedir>${project.basedir}</site.basedir>
-	</properties>
-
-	<groupId>org.eclipse.uomo</groupId>
-	<artifactId>org.eclipse.uomo</artifactId>
-	<version>0.7.0-SNAPSHOT</version>
-	<packaging>pom</packaging>
-	<name>Eclipse UOMo</name>
-
-	<!-- =========================================================== -->
-	<!-- Developers and Contributors -->
-	<!-- =========================================================== -->
-	<description>UOMo adds Units of Measurement support for IT Systems and Services both to Language and Data.</description>
-	<url>http://www.eclipse.org/uomo/</url>
-	<issueManagement>
-		<system>Bugzilla</system>
-		<url>https://bugs.eclipse.org/bugs/</url>
-	</issueManagement>
-	<inceptionYear>2010</inceptionYear>
-	<developers>
-		<developer>
-			<name>Werner Keil</name>
-			<id>wkeil</id>
-			<organization>Creative Arts &amp; Technologies</organization>
-			<organizationUrl>http://www.catmedia.us</organizationUrl>
-			<email>werner.keil@gmx.net</email>
-			<timezone>0</timezone>
-			<roles>
-				<role>Project Lead</role>
-				<role>Architect</role>
-				<role>Java Developer</role>
-			</roles>
-		</developer>
-		<developer>
-			<name>Chris Senior</name>
-			<id>csenior</id>
-			<email>christopher.senior@gmail.com</email>
-			<organization>Private Individual</organization>
-			<roles>
-				<role>Architect</role>
-				<role>Java Developer</role>
-			</roles>
-		</developer>
-	</developers>
-	<contributors>
-		<contributor>
-			<name>Grahame Grieve</name>
-			<!-- id>grahameg</id -->
-			<email>grahame@healthintersections.com.au</email>
-			<organization>Health Intersections</organization>
-			<organizationUrl>http://www.healthintersections.com.au</organizationUrl>
-			<roles>
-				<role>UCUM Lead emeritus</role>
-				<role>Architect</role>
-				<role>Java Developer (inactive)</role>
-			</roles>
-		</contributor>
-
-	</contributors>
-	<scm>
-		<url>http://git.eclipse.org/c/uomo/org.eclipse.uomo.git/</url>
-	</scm>
-	<organization>
-		<name>Eclipse Foundation</name>
-		<url>http://www.eclipse.org</url>
-	</organization>
-	<modules>
-		<module>bundles</module>
-		<module>features</module>
-		<module>examples</module>
-		<module>releng</module>
-	</modules>
-	<!-- ======================================================= -->
-	<!-- Build Settings -->
-	<!-- ======================================================= -->
-	<build>
-		<plugins>
-		 <plugin>
-    <artifactId>maven-resources-plugin</artifactId>
-    <version>2.5</version>
-    <executions>
-      <execution>
-        <id>copy-sitedescriptor</id>
-        <!-- fetch site.xml before creating site documentation -->
-        <phase>pre-site</phase>
-        <goals>
-          <goal>copy-resources</goal>
-        </goals>
-        <configuration>
-          <outputDirectory>${basedir}/src/site/</outputDirectory>
-          <resources>          
-            <resource>                  
-              <directory>${site.basedir}/src/site/</directory>
-              <includes>
-                <include>**/site.xml</include>
-              </includes>
-            </resource>
-          </resources>              
-        </configuration>            
-      </execution>
-    </executions>
-   </plugin>        
-			<plugin>
-				<!-- This sets up the target platform in PDE terms The version of Eclipse 
-					that the source will be built against -->
-				<groupId>org.eclipse.tycho</groupId>
-				<artifactId>target-platform-configuration</artifactId>
-				<version>${tycho-version}</version>
-				<configuration>
-					<resolver>p2</resolver>
-					<target>
-						<artifact>
-							<groupId>org.eclipse.uomo</groupId>
-							<artifactId>org.eclipse.uomo.target</artifactId>
-							<version>0.7.0-SNAPSHOT</version>
-							<classifier>indigo</classifier>
-						</artifact>
-					</target>
-					<ignoreTychoRepositories>true</ignoreTychoRepositories>
-					<environments>
-						<environment>
-							<os>win32</os>
-							<ws>win32</ws>
-							<arch>x86</arch>
-						</environment>
-						<environment>
-							<os>linux</os>
-							<ws>gtk</ws>
-							<arch>x86</arch>
-						</environment>
-					</environments>
-				</configuration>
-			</plugin>
-			<plugin>
-				<groupId>org.eclipse.tycho</groupId>
-				<artifactId>tycho-maven-plugin</artifactId>
-				<version>${tycho-version}</version>
-				<extensions>true</extensions>
-			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-jar-plugin</artifactId>
-				<version>2.4</version>
-			</plugin>
-			<!-- <plugin> <groupId>org.sonatype.tycho</groupId> <artifactId>maven-osgi-packaging-plugin</artifactId> 
-				<version>${tycho-version}</version> <configuration> <archive> <addMavenDescriptor>false</addMavenDescriptor> 
-				</archive> </configuration> </plugin> -->
-		</plugins>
-	</build>
-
-
-	<!-- ==================================================== -->
-	<!-- Repositories. This is where Maven looks for dependencies. The Maven 
-		repository is implicit and doesn't need to be specified. -->
-	<!-- ==================================================== -->
-	<!--  repositories>
-		<repository>
-			<id>eclipse-public</id>
-			<name>Public Eclipse.org Nexus</name>
-			<url>http://maven.eclipse.org/nexus/content/groups/public/</url>
-		</repository>
-
-		<repository>
-			<id>eclipse-central</id>
-			<name>Central Eclipse.org Nexus</name>
-			<url>http://maven.eclipse.org/nexus/content/groups/central/</url>
-		</repository> -->
- 	<repositories>
-		<repository>
-			<id>maven-geotoolkit.org</id>
-			<name>GeoToolkit Repository for Maven</name>
-			<url>http://maven.geotoolkit.org/</url>
-		</repository>
-	</repositories>
-	<ciManagement>
-		<system>Hudson</system>
-		<url>https://hudson.eclipse.org/hudson/job/uomo/</url>
-	</ciManagement>
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- ======================================================================= 
+	Maven Project Configuration File Eclipse UOMo http://www.eclipse.org/proposals/uomo/ 
+	======================================================================= -->
+
+<!-- $Id: pom.xml 306 2012-10-29 20:42:27Z werner.keil $ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<parent>
+		<!-- 
+		<artifactId>eclipse-parent</artifactId>
+		<groupId>org.eclipse</groupId>
+		<version>1.0.0</version>
+ -->
+		<groupId>org.sonatype.oss</groupId>
+		<artifactId>oss-parent</artifactId>
+		<version>9</version>
+	</parent>
+	
+	<modelVersion>4.0.0</modelVersion>
+	<properties>
+		<sourceEncoding>UTF-8</sourceEncoding> <!-- in Maven 3. -->
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<project.build.javaVersion>1.6</project.build.javaVersion>
+		<maven.compilerPlugin.version>2.3.2</maven.compilerPlugin.version>
+		<uomo-version>0.7.0-SNAPSHOT</uomo-version>
+		<tycho-version>0.16.0</tycho-version>
+		<icu4j-version>50.1.1</icu4j-version>
+		<maven.compiler.source>1.6</maven.compiler.source>
+		<maven.compiler.target>1.6</maven.compiler.target>
+		<site.basedir>${project.basedir}</site.basedir>
+	</properties>
+
+	<groupId>org.eclipse.uomo</groupId>
+	<artifactId>org.eclipse.uomo</artifactId>
+	<version>0.7.0-SNAPSHOT</version>
+	<packaging>pom</packaging>
+	<name>Eclipse UOMo</name>
+
+	<!-- =========================================================== -->
+	<!-- Developers and Contributors -->
+	<!-- =========================================================== -->
+	<description>UOMo adds Units of Measurement support for IT Systems and Services both to Language and Data.</description>
+	<url>http://www.eclipse.org/uomo/</url>
+	<issueManagement>
+		<system>Bugzilla</system>
+		<url>https://bugs.eclipse.org/bugs/</url>
+	</issueManagement>
+	<inceptionYear>2010</inceptionYear>
+	<developers>
+		<developer>
+			<name>Werner Keil</name>
+			<id>wkeil</id>
+			<organization>Creative Arts &amp; Technologies</organization>
+			<organizationUrl>http://www.catmedia.us</organizationUrl>
+			<email>werner.keil@gmx.net</email>
+			<timezone>0</timezone>
+			<roles>
+				<role>Project Lead</role>
+				<role>Architect</role>
+				<role>Java Developer</role>
+			</roles>
+		</developer>
+		<developer>
+			<name>Chris Senior</name>
+			<id>csenior</id>
+			<email>christopher.senior@gmail.com</email>
+			<organization>Private Individual</organization>
+			<roles>
+				<role>Architect</role>
+				<role>Java Developer</role>
+			</roles>
+		</developer>
+	</developers>
+	<contributors>
+		<contributor>
+			<name>Grahame Grieve</name>
+			<!-- id>grahameg</id -->
+			<email>grahame@healthintersections.com.au</email>
+			<organization>Health Intersections</organization>
+			<organizationUrl>http://www.healthintersections.com.au</organizationUrl>
+			<roles>
+				<role>UCUM Lead emeritus</role>
+				<role>Architect</role>
+				<role>Java Developer (inactive)</role>
+			</roles>
+		</contributor>
+
+	</contributors>
+	<scm>
+		<url>http://git.eclipse.org/c/uomo/org.eclipse.uomo.git/</url>
+	</scm>
+	<organization>
+		<name>Eclipse Foundation</name>
+		<url>http://www.eclipse.org</url>
+	</organization>
+	<modules>
+		<module>bundles</module>
+		<module>features</module>
+		<module>examples</module>
+		<module>releng</module>
+	</modules>
+	<!-- ======================================================= -->
+	<!-- Build Settings -->
+	<!-- ======================================================= -->
+	<build>
+		<plugins>
+		 <plugin>
+    <artifactId>maven-resources-plugin</artifactId>
+    <version>2.5</version>
+    <executions>
+      <execution>
+        <id>copy-sitedescriptor</id>
+        <!-- fetch site.xml before creating site documentation -->
+        <phase>pre-site</phase>
+        <goals>
+          <goal>copy-resources</goal>
+        </goals>
+        <configuration>
+          <outputDirectory>${basedir}/src/site/</outputDirectory>
+          <resources>          
+            <resource>                  
+              <directory>${site.basedir}/src/site/</directory>
+              <includes>
+                <include>**/site.xml</include>
+              </includes>
+            </resource>
+          </resources>              
+        </configuration>            
+      </execution>
+    </executions>
+   </plugin>        
+			<plugin>
+				<!-- This sets up the target platform in PDE terms The version of Eclipse 
+					that the source will be built against -->
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>target-platform-configuration</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+					<resolver>p2</resolver>
+					<target>
+						<artifact>
+							<groupId>org.eclipse.uomo</groupId>
+							<artifactId>org.eclipse.uomo.target</artifactId>
+							<version>0.7.0-SNAPSHOT</version>
+							<classifier>indigo</classifier>
+						</artifact>
+					</target>
+					<ignoreTychoRepositories>true</ignoreTychoRepositories>
+					<environments>
+						<environment>
+							<os>win32</os>
+							<ws>win32</ws>
+							<arch>x86</arch>
+						</environment>
+						<environment>
+							<os>linux</os>
+							<ws>gtk</ws>
+							<arch>x86</arch>
+						</environment>
+					</environments>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-maven-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<extensions>true</extensions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-jar-plugin</artifactId>
+				<version>2.4</version>
+			</plugin>
+			<!-- <plugin> <groupId>org.sonatype.tycho</groupId> <artifactId>maven-osgi-packaging-plugin</artifactId> 
+				<version>${tycho-version}</version> <configuration> <archive> <addMavenDescriptor>false</addMavenDescriptor> 
+				</archive> </configuration> </plugin> -->
+		</plugins>
+	</build>
+
+
+	<!-- ==================================================== -->
+	<!-- Repositories. This is where Maven looks for dependencies. The Maven 
+		repository is implicit and doesn't need to be specified. -->
+	<!-- ==================================================== -->
+	<!--  repositories>
+		<repository>
+			<id>eclipse-public</id>
+			<name>Public Eclipse.org Nexus</name>
+			<url>http://maven.eclipse.org/nexus/content/groups/public/</url>
+		</repository>
+
+		<repository>
+			<id>eclipse-central</id>
+			<name>Central Eclipse.org Nexus</name>
+			<url>http://maven.eclipse.org/nexus/content/groups/central/</url>
+		</repository> -->
+ 	<repositories>
+		<repository>
+			<id>maven-geotoolkit.org</id>
+			<name>GeoToolkit Repository for Maven</name>
+			<url>http://maven.geotoolkit.org/</url>
+		</repository>
+	</repositories>
+	<ciManagement>
+		<system>Hudson</system>
+		<url>https://hudson.eclipse.org/hudson/job/uomo/</url>
+	</ciManagement>
 </project>
\ No newline at end of file
diff --git a/releng/.project b/releng/.project
index 75a9c24..b6668b5 100644
--- a/releng/.project
+++ b/releng/.project
@@ -1,17 +1,17 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.uomo.releng</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.uomo.releng</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/releng/.settings/org.eclipse.m2e.core.prefs b/releng/.settings/org.eclipse.m2e.core.prefs
index f897a7f..14b697b 100644
--- a/releng/.settings/org.eclipse.m2e.core.prefs
+++ b/releng/.settings/org.eclipse.m2e.core.prefs
@@ -1,4 +1,4 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/releng/eclipse-repository/.project b/releng/eclipse-repository/.project
index 15d302d..e82335e 100644
--- a/releng/eclipse-repository/.project
+++ b/releng/eclipse-repository/.project
@@ -1,17 +1,17 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>eclipse-repository</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>eclipse-repository</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/releng/eclipse-repository/category.xml b/releng/eclipse-repository/category.xml
index c508010..4720bfd 100644
--- a/releng/eclipse-repository/category.xml
+++ b/releng/eclipse-repository/category.xml
@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-   <feature url="features/org.eclipse.uomo.feature_0.7.0.qualifier.jar" id="org.eclipse.uomo.feature" version="0.7.0.qualifier">
-   	  <category name="uomo-category"/>
-   </feature>
-   <category-def name="uomo-category" label="Units of Measurement (UOMo)">
-      <description>
-         UOMo adds Units of Measurement support for IT Systems and Services both to Language and Data.
-      </description>
-   </category-def>
-</site>
+<?xml version="1.0" encoding="UTF-8"?>
+<site>
+   <feature url="features/org.eclipse.uomo.feature_0.7.0.qualifier.jar" id="org.eclipse.uomo.feature" version="0.7.0.qualifier">
+   	  <category name="uomo-category"/>
+   </feature>
+   <category-def name="uomo-category" label="Units of Measurement (UOMo)">
+      <description>
+         UOMo adds Units of Measurement support for IT Systems and Services both to Language and Data.
+      </description>
+   </category-def>
+</site>
diff --git a/releng/eclipse-repository/pom.xml b/releng/eclipse-repository/pom.xml
index 1a92214..c2a5c5c 100644
--- a/releng/eclipse-repository/pom.xml
+++ b/releng/eclipse-repository/pom.xml
@@ -1,12 +1,12 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <artifactId>org.eclipse.uomo.releng</artifactId>
-    <groupId>org.eclipse.uomo</groupId>
-    <version>0.7.0-SNAPSHOT</version>
-  </parent>
-  <artifactId>eclipse-repository</artifactId>
-  <name>Eclipse UOMo Repository</name>
-  <packaging>eclipse-repository</packaging>
-  
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>org.eclipse.uomo.releng</artifactId>
+    <groupId>org.eclipse.uomo</groupId>
+    <version>0.7.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>eclipse-repository</artifactId>
+  <name>Eclipse UOMo Repository</name>
+  <packaging>eclipse-repository</packaging>
+  
 </project>
\ No newline at end of file
diff --git a/releng/org.eclipse.uomo.target/.gitignore b/releng/org.eclipse.uomo.target/.gitignore
index 40a85ff..15a95ee 100644
--- a/releng/org.eclipse.uomo.target/.gitignore
+++ b/releng/org.eclipse.uomo.target/.gitignore
@@ -1 +1 @@
-/.settings
+/.settings
