From 6662294a7f679c31b12b1f10003cf28d02f625f1 Mon Sep 17 00:00:00 2001
From: Bjoern Martin  Creates a new instance of this class. The Sigar instance is stored (and 
-	 * accessible) via the {@link #sigarImpl} member. A second instance is 
-	 * stored within the {@link #sigar} member which is either {@link #sigarImpl}
-	 * or an instance of {@link SigarProxyCache} with the expiration time set to 
-	 * whatever the  The following cache modes exist: Note: Only make use of the cacheless or half second mode if you 
-	 * know what you are doing. They may have impact on system performance if 
-	 * used excessively. Creates a new instance of this class. The Sigar instance is stored (and 
+     * accessible) via the {@link #sigarImpl} member. A second instance is 
+     * stored within the {@link #sigar} member which is either {@link #sigarImpl}
+     * or an instance of {@link SigarProxyCache} with the expiration time set to 
+     * whatever the  The following cache modes exist: Note: Only make use of the cacheless or half second mode if you 
+     * know what you are doing. They may have impact on system performance if 
+     * used excessively. Returns  Note: Make sure any subclass does a super call to this method, 
-	 * otherwise the implementation might be broken. Note: Make sure any subclass does a super call to this method, 
-	 * otherwise the implementation might be broken. Note: Make sure any subclass does a super call to this method, 
-	 * otherwise the implementation might be broken. Note: Make sure any subclass does a super call to this method, 
-	 * otherwise the implementation might be broken. Returns  Note: Make sure any subclass does a super call to this method, 
+     * otherwise the implementation might be broken. Note: Make sure any subclass does a super call to this method, 
+     * otherwise the implementation might be broken. Note: Make sure any subclass does a super call to this method, 
+     * otherwise the implementation might be broken. Note: Make sure any subclass does a super call to this method, 
+     * otherwise the implementation might be broken.null when
-	 * the deregistration finished.
-	 * 
-	 * @see #preRegister(MBeanServer, ObjectName)
-	 * @see #postDeregister()
-	 */
-	protected MBeanServer mbeanServer;
+    /**
+     * The MBean server this MBean is registered to. Set during the MBean's 
+     * registration to the MBean server and unset to null when
+     * the deregistration finished.
+     * 
+     * @see #preRegister(MBeanServer, ObjectName)
+     * @see #postDeregister()
+     */
+    protected MBeanServer mbeanServer;
 
-	/**
-	 * cacheMode parameter specifies.
-	 * 
-	 * 
-	 * Constant Description {@link #CACHELESS} No cached instance, {@link #sigar} 
-	 * 		 == {@link #sigarImpl}.{@link #CACHED_500MS} 500 millisecond cache, for high 
-	 * 		frequency queries on raw data such as reading out CPU timers each 
-	 * 		second. Avoids reading out multiple data sets when all attributes of 
-	 * 		an MBean are queried in short sequence. {@link #CACHED_5SEC} 5 second cache, for high frequency 
-	 * 		queries on calculated data such as CPU percentages. {@link #CACHED_30SEC} 30 second cache, for normal queries 
-	 * 		or data readouts such as CPU model / vendor. This is the default if 
-	 * 		nothing ( 0) is specified.{@link #DEFAULT} Same as {@link #CACHED_30SEC}. null
-	 * @param cacheMode The cache mode to use for {@link #sigar} or {@link #CACHELESS}
-	 * 		if no separate, cached instance is to be maintained.
-	 */
-	protected AbstractMBean(Sigar sigar, short cacheMode) {
-		// store Sigar
-		this.sigarImpl = sigar;
-		
-		// create a cached instance as well
-		if (cacheMode == CACHELESS) {
-			// no cached version
-			this.sigar = this.sigarImpl;
-			
-		} else if (cacheMode == CACHED_500MS) {
-			// 500ms cached version (for 1/sec queries)
-			this.sigar = SigarProxyCache.newInstance(this.sigarImpl,
-					500);
-			
-		} else if (cacheMode == CACHED_5SEC) {
-			// 5sec cached version (for avg'd queries)
-			this.sigar = SigarProxyCache.newInstance(this.sigarImpl,
-					5000);
-			
-		} else /* if (cacheMode == CACHED_30SEC) */ {
-			// 30sec (default) cached version (for info and long term queries)
-			this.sigar = SigarProxyCache.newInstance(this.sigarImpl,
-					30000);
-		}
-	}
+    /**
+     * cacheMode parameter specifies.
+     * 
+     * 
+     * Constant Description {@link #CACHELESS} No cached instance, {@link #sigar} 
+     *          == {@link #sigarImpl}.{@link #CACHED_500MS} 500 millisecond cache, for high 
+     *         frequency queries on raw data such as reading out CPU timers each 
+     *         second. Avoids reading out multiple data sets when all attributes of 
+     *         an MBean are queried in short sequence. {@link #CACHED_5SEC} 5 second cache, for high frequency 
+     *         queries on calculated data such as CPU percentages. {@link #CACHED_30SEC} 30 second cache, for normal queries 
+     *         or data readouts such as CPU model / vendor. This is the default if 
+     *         nothing ( 0) is specified.{@link #DEFAULT} Same as {@link #CACHED_30SEC}. null
+     * @param cacheMode The cache mode to use for {@link #sigar} or {@link #CACHELESS}
+     *         if no separate, cached instance is to be maintained.
+     */
+    protected AbstractMBean(Sigar sigar, short cacheMode) {
+        // store Sigar
+        this.sigarImpl = sigar;
 
-	/**
-	 * Returns the object name the MBean is registered with within the
-	 * MBeanServer. May be null in case the instance is not
-	 * registered to an MBeanServer, but used standalone.
-	 * 
-	 * @return The object name or null if not registered to an
-	 *         MBeanServer
-	 */
-	public abstract String getObjectName();
+        // create a cached instance as well
+        if (cacheMode == CACHELESS) {
+            // no cached version
+            this.sigar = this.sigarImpl;
 
-	/**
-	 * Returns a runtime exception for the type and SigarException specified.
-	 * 
-	 * @param type
-	 *            The type that was called
-	 * @param e
-	 *            The exception that was raised
-	 * @return A runtime exception encapsulating the information specified
-	 */
-	protected RuntimeException unexpectedError(String type, SigarException e) {
-		String msg = "Unexected error in Sigar.get" + type + ": "
-				+ e.getMessage();
-		return new IllegalArgumentException(msg);
-	}
+        } else if (cacheMode == CACHED_500MS) {
+            // 500ms cached version (for 1/sec queries)
+            this.sigar = SigarProxyCache.newInstance(this.sigarImpl, 500);
 
-	/**
-	 * Loops over all attributes and calls
-	 * {@link DynamicMBean#getAttribute(java.lang.String)} method for each
-	 * attribute sequentially. Any exception thrown by those methods are ignored
-	 * and simply cause the attribute not being added to the result.
-	 */
-	public AttributeList getAttributes(String[] attrs) {
-		final AttributeList result = new AttributeList();
-		for (int i = 0; i < attrs.length; i++) {
-			try {
-				result.add(new Attribute(attrs[i], getAttribute(attrs[i])));
-			} catch (AttributeNotFoundException e) {
-				// ignore, as we cannot throw this exception
-			} catch (MBeanException e) {
-				// ignore, as we cannot throw this exception
-			} catch (ReflectionException e) {
-				// ignore, as we cannot throw this exception
-			}
-		}
-		return result;
-	}
+        } else if (cacheMode == CACHED_5SEC) {
+            // 5sec cached version (for avg'd queries)
+            this.sigar = SigarProxyCache.newInstance(this.sigarImpl, 5000);
 
-	/**
-	 * Loops over all attributes and calls
-	 * {@link DynamicMBean#setAttribute(Attribute)} for each attribute
-	 * sequentially. Any exception thrown by those methods are ignored and
-	 * simply cause the attribute not being added to the result.
-	 */
-	public AttributeList setAttributes(AttributeList attrs) {
-		final AttributeList result = new AttributeList();
-		for (int i = 0; i < attrs.size(); i++) {
-			try {
-				final Attribute next = (Attribute) attrs.get(i);
-				setAttribute(next);
-				result.add(next);
-			} catch (AttributeNotFoundException e) {
-				// ignore, as we cannot throw this exception
-			} catch (InvalidAttributeValueException e) {
-				// ignore, as we cannot throw this exception
-			} catch (MBeanException e) {
-				// ignore, as we cannot throw this exception
-			} catch (ReflectionException e) {
-				// ignore, as we cannot throw this exception
-			}
-		}
-		return result;
-	}
+        } else /* if (cacheMode == CACHED_30SEC) */{
+            // 30sec (default) cached version (for info and long term queries)
+            this.sigar = SigarProxyCache.newInstance(this.sigarImpl, 30000);
+        }
+    }
 
+    /**
+     * Returns the object name the MBean is registered with within the
+     * MBeanServer. May be null in case the instance is not
+     * registered to an MBeanServer, but used standalone.
+     * 
+     * @return The object name or null if not registered to an
+     *         MBeanServer
+     */
+    public abstract String getObjectName();
 
-	
-	// -------
-	// Implementation of the MBeanRegistration interface
-	// -------
-	
-	/**
-	 * new ObjectName(this.getObjectName()) to guarantee 
-	 * a reliable and reproducable object name.new ObjectName(this.getObjectName()) to guarantee 
+     * a reliable and reproducable object name.Cpu information package.
- * Provides an OpenMBean conform implementation.
+ * Sigar JMX MBean implementation for the Cpu information
+ * package. Provides an OpenMBean conform implementation.
  * 
  * @author Bjoern Martin
- * @since 1.4 (2007-04)
+ * @since 1.5
  */
 public class SigarCpu extends AbstractMBean {
 
-	private static final String MBEAN_TYPE = "CpuList";
+    private static final String MBEAN_TYPE = "CpuList";
 
-	private static final MBeanInfo MBEAN_INFO;
-	
-	private static final MBeanAttributeInfo MBEAN_ATTR_CPUINDEX;
+    private static final MBeanInfo MBEAN_INFO;
 
-	private static final MBeanAttributeInfo MBEAN_ATTR_IDLE;
+    private static final MBeanAttributeInfo MBEAN_ATTR_CPUINDEX;
 
-	private static final MBeanAttributeInfo MBEAN_ATTR_NICE;
+    private static final MBeanAttributeInfo MBEAN_ATTR_IDLE;
 
-	private static final MBeanAttributeInfo MBEAN_ATTR_SYS;
+    private static final MBeanAttributeInfo MBEAN_ATTR_NICE;
 
-	private static final MBeanAttributeInfo MBEAN_ATTR_TOTAL;
+    private static final MBeanAttributeInfo MBEAN_ATTR_SYS;
 
-	private static final MBeanAttributeInfo MBEAN_ATTR_USER;
+    private static final MBeanAttributeInfo MBEAN_ATTR_TOTAL;
 
-	private static final MBeanAttributeInfo MBEAN_ATTR_WAIT;
+    private static final MBeanAttributeInfo MBEAN_ATTR_USER;
 
-	private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX;
+    private static final MBeanAttributeInfo MBEAN_ATTR_WAIT;
 
-	private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX_SIGAR;
+    private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX;
 
-	private static MBeanParameterInfo MBEAN_PARAM_CPUINDEX;
+    private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX_SIGAR;
 
-	private static MBeanParameterInfo MBEAN_PARAM_SIGAR;
-	
-	static {
-		MBEAN_ATTR_CPUINDEX = new MBeanAttributeInfo(
-				"CpuIndex", "int",
-				"The index of the CPU, typically starting at 0",
-				true, false, false);
-		MBEAN_ATTR_IDLE = new MBeanAttributeInfo(
-				"Idle", "long",
-				"The idle time of the CPU, in [ms]",
-				true, false, false);
-		MBEAN_ATTR_NICE = new MBeanAttributeInfo(
-				"Nice", "long",
-				"The time of the CPU spent on nice priority, in [ms]",
-				true, false, false);
-		MBEAN_ATTR_SYS = new MBeanAttributeInfo(
-				"Sys", "long",
-				"The time of the CPU used by the system, in [ms]",
-				true, false, false);
-		MBEAN_ATTR_TOTAL = new MBeanAttributeInfo(
-				"Total", "long",
-				"The total time of the CPU, in [ms]",
-				true, false, false);
-		MBEAN_ATTR_USER = new MBeanAttributeInfo(
-				"User", "long",
-				"The time of the CPU used by user processes, in [ms]",
-				true, false, false);
-		MBEAN_ATTR_WAIT = new MBeanAttributeInfo(
-				"Wait", "long",
-				"The time the CPU had to wait for data to be loaded, in [ms]",
-				true, false, false);
-		MBEAN_PARAM_CPUINDEX = new MBeanParameterInfo(
-				"cpuIndex", "int",
-				"The index of the CPU to read data for. Must be >= 0 " +
-				"and not exceed the CPU count of the system");
-		MBEAN_PARAM_SIGAR = new MBeanParameterInfo(
-				"sigar", Sigar.class.getName(),
-				"The Sigar instance to use to fetch data from");
-		MBEAN_CONSTR_CPUINDEX = new MBeanConstructorInfo(
-				SigarCpu.class.getName(),
-				"Creates a new instance for the CPU index specified, " +
-				"using a new Sigar instance to fetch the data. " +
-				"Fails if the CPU index is out of range.",
-				new MBeanParameterInfo[]{
-						MBEAN_PARAM_CPUINDEX});
-		MBEAN_CONSTR_CPUINDEX_SIGAR = new MBeanConstructorInfo(
-				SigarCpu.class.getName(),
-				"Creates a new instance for the CPU index specified, " +
-				"using the Sigar instance specified to fetch the data. " +
-				"Fails if the CPU index is out of range.",
-				new MBeanParameterInfo[]{
-					MBEAN_PARAM_SIGAR,
-					MBEAN_PARAM_CPUINDEX});
-		MBEAN_INFO = new MBeanInfo(
-				SigarCpu.class.getName(),
-				"Sigar CPU MBean. Provides raw timing data for a single " +
-				"CPU. The data is cached for 500ms, meaning each request " +
-				"(and as a result each block request to all parameters) " +
-				"within half a second is satisfied from the same dataset.",
-				new MBeanAttributeInfo[]{
-					MBEAN_ATTR_CPUINDEX, 
-					MBEAN_ATTR_IDLE, 
-					MBEAN_ATTR_NICE, 
-					MBEAN_ATTR_SYS, 
-					MBEAN_ATTR_TOTAL, 
-					MBEAN_ATTR_USER, 
-					MBEAN_ATTR_WAIT}, 
-				new MBeanConstructorInfo[]{
-					MBEAN_CONSTR_CPUINDEX,
-					MBEAN_CONSTR_CPUINDEX_SIGAR},
-					null, null);
-		
-	}
+    private static MBeanParameterInfo MBEAN_PARAM_CPUINDEX;
 
-	/**
-	 * Index of the CPU processed by the instance.
-	 */
-	private final int cpuIndex;
+    private static MBeanParameterInfo MBEAN_PARAM_SIGAR;
 
-	/**
-	 * Object name this instance will give itself when being registered to an 
-	 * MBeanServer.
-	 */
-	private final String objectName;
+    static {
+        MBEAN_ATTR_CPUINDEX = new MBeanAttributeInfo("CpuIndex", "int",
+                "The index of the CPU, typically starting at 0", true, false,
+                false);
+        MBEAN_ATTR_IDLE = new MBeanAttributeInfo("Idle", "long",
+                "The idle time of the CPU, in [ms]", true, false, false);
+        MBEAN_ATTR_NICE = new MBeanAttributeInfo("Nice", "long",
+                "The time of the CPU spent on nice priority, in [ms]", true,
+                false, false);
+        MBEAN_ATTR_SYS = new MBeanAttributeInfo("Sys", "long",
+                "The time of the CPU used by the system, in [ms]", true, false,
+                false);
+        MBEAN_ATTR_TOTAL = new MBeanAttributeInfo("Total", "long",
+                "The total time of the CPU, in [ms]", true, false, false);
+        MBEAN_ATTR_USER = new MBeanAttributeInfo("User", "long",
+                "The time of the CPU used by user processes, in [ms]", true,
+                false, false);
+        MBEAN_ATTR_WAIT = new MBeanAttributeInfo("Wait", "long",
+                "The time the CPU had to wait for data to be loaded, in [ms]",
+                true, false, false);
+        MBEAN_PARAM_CPUINDEX = new MBeanParameterInfo("cpuIndex", "int",
+                "The index of the CPU to read data for. Must be >= 0 "
+                        + "and not exceed the CPU count of the system");
+        MBEAN_PARAM_SIGAR = new MBeanParameterInfo("sigar", Sigar.class
+                .getName(), "The Sigar instance to use to fetch data from");
+        MBEAN_CONSTR_CPUINDEX = new MBeanConstructorInfo(SigarCpu.class
+                .getName(),
+                "Creates a new instance for the CPU index specified, "
+                        + "using a new Sigar instance to fetch the data. "
+                        + "Fails if the CPU index is out of range.",
+                new MBeanParameterInfo[] { MBEAN_PARAM_CPUINDEX });
+        MBEAN_CONSTR_CPUINDEX_SIGAR = new MBeanConstructorInfo(
+                SigarCpu.class.getName(),
+                "Creates a new instance for the CPU index specified, "
+                        + "using the Sigar instance specified to fetch the data. "
+                        + "Fails if the CPU index is out of range.",
+                new MBeanParameterInfo[] { MBEAN_PARAM_SIGAR,
+                        MBEAN_PARAM_CPUINDEX });
+        MBEAN_INFO = new MBeanInfo(
+                SigarCpu.class.getName(),
+                "Sigar CPU MBean. Provides raw timing data for a single "
+                        + "CPU. The data is cached for 500ms, meaning each request "
+                        + "(and as a result each block request to all parameters) "
+                        + "within half a second is satisfied from the same dataset.",
+                new MBeanAttributeInfo[] { MBEAN_ATTR_CPUINDEX,
+                        MBEAN_ATTR_IDLE, MBEAN_ATTR_NICE, MBEAN_ATTR_SYS,
+                        MBEAN_ATTR_TOTAL, MBEAN_ATTR_USER, MBEAN_ATTR_WAIT },
+                new MBeanConstructorInfo[] { MBEAN_CONSTR_CPUINDEX,
+                        MBEAN_CONSTR_CPUINDEX_SIGAR }, null, null);
 
-	/**
-	 * Creates a new instance for the CPU index specified, using a new Sigar 
-	 * instance to fetch the data. Fails if the CPU index is out of range.
-	 * 
-	 * @param cpuIndex The index of the CPU to read data for. Must be 
-	 * 		>= 0 and not exceed the CPU count of the system.
-	 * 
-	 * @throws IllegalArgumentException If the CPU index is out of range or 
-	 * 		an unexpected Sigar error occurs
-	 */
-	public SigarCpu(int cpuIndex) throws IllegalArgumentException {
-		this(new Sigar(), cpuIndex);
-	}
+    }
 
-	/**
-	 * Creates a new instance for the CPU index specified, using the Sigar 
-	 * instance specified to fetch the data. Fails if the CPU index is out 
-	 * of range.
-	 * 
-	 * @param sigar The Sigar instance to use to fetch data from
-	 * @param cpuIndex The index of the CPU to read data for. Must be 
-	 * 		>= 0 and not exceed the CPU count of the system.
-	 * 
-	 * @throws IllegalArgumentException If the CPU index is out of range or 
-	 * 		an unexpected Sigar error occurs
-	 */
-	public SigarCpu(Sigar sigar, int cpuIndex) throws IllegalArgumentException {
-		super(sigar, CACHED_500MS);
+    /**
+     * Index of the CPU processed by the instance.
+     */
+    private final int cpuIndex;
 
-		// check index
-		if (cpuIndex < 0)
-			throw new IllegalArgumentException(
-					"CPU index has to be non-negative: " + cpuIndex);
-		try {
-			int cpuCount;
-			if ((cpuCount = sigar.getCpuList().length) < cpuIndex)
-				throw new IllegalArgumentException(
-						"CPU index out of range (found " + cpuCount + " CPU(s)): " + cpuIndex);
-			
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-		
-		// all fine
-		this.cpuIndex = cpuIndex;
-		this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" 
-		+ MBEAN_ATTR_TYPE + "=Cpu," 
-		+ MBEAN_ATTR_CPUINDEX.getName().substring(0, 1).toLowerCase() 
-		+ MBEAN_ATTR_CPUINDEX.getName().substring(1) + "=" + cpuIndex;
-	}
+    /**
+     * Object name this instance will give itself when being registered to an
+     * MBeanServer.
+     */
+    private final String objectName;
 
-	/**
-	 * Object name this instance will give itself when being registered to an 
-	 * MBeanServer.
-	 */
-	public String getObjectName() {
-		return this.objectName;
-	}
-	
-	/** 
-	 * @return The index of the CPU, typically starting at 0
-	 */
-	public int getCpuIndex() {
-		return this.cpuIndex;
-	}
-	
-	/**
-	 * @return The idle time of the CPU, in [ms]
-	 */
-	public long getIdle() {
-		try {
-			return sigar.getCpuList()[this.cpuIndex].getIdle();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
-	
-	/**
-	 * @return The time of the CPU spent on nice priority, in [ms]
-	 */
-	public long getNice() {
-		try {
-			return sigar.getCpuList()[this.cpuIndex].getNice();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
-	
-	/**
-	 * @return The time of the CPU used by the system, in [ms]
-	 */
-	public long getSys() {
-		try {
-			return sigar.getCpuList()[this.cpuIndex].getSys();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
-	
-	/**
-	 * @return The total time of the CPU, in [ms]
-	 */
-	public long getTotal() {
-		try {
-			return sigar.getCpuList()[this.cpuIndex].getTotal();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
-	
-	/**
-	 * @return The time of the CPU used by user processes, in [ms]
-	 */
-	public long getUser() {
-		try {
-			return sigar.getCpuList()[this.cpuIndex].getUser();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
-	
-	/**
-	 * @return The time the CPU had to wait for data to be loaded, in [ms]
-	 */
-	public long getWait() {
-		try {
-			return sigar.getCpuList()[this.cpuIndex].getWait();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+    /**
+     * Creates a new instance for the CPU index specified, using a new Sigar
+     * instance to fetch the data. Fails if the CPU index is out of range.
+     * 
+     * @param cpuIndex 
+     *      The index of the CPU to read data for. Must be >= 0 
+     *      and not exceed the CPU count of the system.
+     * 
+     * @throws IllegalArgumentException
+     *      If the CPU index is out of range or an unexpected Sigar error
+     *      occurs.
+     */
+    public SigarCpu(int cpuIndex) throws IllegalArgumentException {
+        this(new Sigar(), cpuIndex);
+    }
 
-	
-	
-	// -------
-	// Implementation of the DynamicMBean interface
-	// -------
-	
-	/*
-	 * (non-Javadoc)
-	 * @see DynamicMBean#getAttribute(String)
-	 */
-	public Object getAttribute(String attr) throws AttributeNotFoundException {
-		
-		if (MBEAN_ATTR_CPUINDEX.getName().equals(attr)) {
-			return new Integer(getCpuIndex());
-		
-		} else if (MBEAN_ATTR_IDLE.getName().equals(attr)) {
-			return new Long(getIdle());
-			
-		} else if (MBEAN_ATTR_NICE.getName().equals(attr)) {
-			return new Long(getNice());
-			
-		} else if (MBEAN_ATTR_SYS.getName().equals(attr)) {
-			return new Long(getSys());
-			
-		} else if (MBEAN_ATTR_TOTAL.getName().equals(attr)) {
-			return new Long(getTotal());
-			
-		} else if (MBEAN_ATTR_USER.getName().equals(attr)) {
-			return new Long(getUser());
-			
-		} else if (MBEAN_ATTR_WAIT.getName().equals(attr)) {
-			return new Long(getWait());
-			
-		} else {
-			throw new AttributeNotFoundException(attr);
-		}
-	}
+    /**
+     * Creates a new instance for the CPU index specified, using the Sigar
+     * instance specified to fetch the data. Fails if the CPU index is out of
+     * range.
+     * 
+     * @param sigar
+     *            The Sigar instance to use to fetch data from
+     * @param cpuIndex
+     *            The index of the CPU to read data for. Must be
+     *            >= 0 and not exceed the CPU count of the
+     *            system.
+     * 
+     * @throws IllegalArgumentException
+     *             If the CPU index is out of range or an unexpected Sigar error
+     *             occurs
+     */
+    public SigarCpu(Sigar sigar, int cpuIndex) throws IllegalArgumentException {
+        super(sigar, CACHED_500MS);
 
-	/*
-	 * (non-Javadoc)
-	 * @see DynamicMBean#setAttribute(Attribute)
-	 */
-	public void setAttribute(Attribute attr) throws AttributeNotFoundException {
-		throw new AttributeNotFoundException(attr.getName());
-	}
+        // check index
+        if (cpuIndex < 0)
+            throw new IllegalArgumentException(
+                    "CPU index has to be non-negative: " + cpuIndex);
+        try {
+            int cpuCount;
+            if ((cpuCount = sigar.getCpuList().length) < cpuIndex)
+                throw new IllegalArgumentException(
+                        "CPU index out of range (found " + cpuCount
+                                + " CPU(s)): " + cpuIndex);
 
-	/*
-	 * (non-Javadoc)
-	 * @see DynamicMBean#invoke(String, Object[], String[])
-	 */
-	public Object invoke(String actionName, Object[] params, String[] signature) throws ReflectionException {
-		throw new ReflectionException(new NoSuchMethodException(actionName), actionName);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see DynamicMBean#getMBeanInfo()
-	 */
-	public MBeanInfo getMBeanInfo() {
-		return MBEAN_INFO;
-	}
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+
+        // all fine
+        this.cpuIndex = cpuIndex;
+        this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" + MBEAN_ATTR_TYPE
+                + "=Cpu,"
+                + MBEAN_ATTR_CPUINDEX.getName().substring(0, 1).toLowerCase()
+                + MBEAN_ATTR_CPUINDEX.getName().substring(1) + "=" + cpuIndex;
+    }
+
+    /**
+     * Object name this instance will give itself when being registered to an
+     * MBeanServer.
+     */
+    public String getObjectName() {
+        return this.objectName;
+    }
+
+    /**
+     * @return The index of the CPU, typically starting at 0
+     */
+    public int getCpuIndex() {
+        return this.cpuIndex;
+    }
+
+    /**
+     * @return The idle time of the CPU, in [ms]
+     */
+    public long getIdle() {
+        try {
+            return sigar.getCpuList()[this.cpuIndex].getIdle();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
+
+    /**
+     * @return The time of the CPU spent on nice priority, in [ms]
+     */
+    public long getNice() {
+        try {
+            return sigar.getCpuList()[this.cpuIndex].getNice();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
+
+    /**
+     * @return The time of the CPU used by the system, in [ms]
+     */
+    public long getSys() {
+        try {
+            return sigar.getCpuList()[this.cpuIndex].getSys();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
+
+    /**
+     * @return The total time of the CPU, in [ms]
+     */
+    public long getTotal() {
+        try {
+            return sigar.getCpuList()[this.cpuIndex].getTotal();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
+
+    /**
+     * @return The time of the CPU used by user processes, in [ms]
+     */
+    public long getUser() {
+        try {
+            return sigar.getCpuList()[this.cpuIndex].getUser();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
+
+    /**
+     * @return The time the CPU had to wait for data to be loaded, in [ms]
+     */
+    public long getWait() {
+        try {
+            return sigar.getCpuList()[this.cpuIndex].getWait();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
+
+    // -------
+    // Implementation of the DynamicMBean interface
+    // -------
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see DynamicMBean#getAttribute(String)
+     */
+    public Object getAttribute(String attr) throws AttributeNotFoundException {
+
+        if (MBEAN_ATTR_CPUINDEX.getName().equals(attr)) {
+            return new Integer(getCpuIndex());
+
+        } else if (MBEAN_ATTR_IDLE.getName().equals(attr)) {
+            return new Long(getIdle());
+
+        } else if (MBEAN_ATTR_NICE.getName().equals(attr)) {
+            return new Long(getNice());
+
+        } else if (MBEAN_ATTR_SYS.getName().equals(attr)) {
+            return new Long(getSys());
+
+        } else if (MBEAN_ATTR_TOTAL.getName().equals(attr)) {
+            return new Long(getTotal());
+
+        } else if (MBEAN_ATTR_USER.getName().equals(attr)) {
+            return new Long(getUser());
+
+        } else if (MBEAN_ATTR_WAIT.getName().equals(attr)) {
+            return new Long(getWait());
+
+        } else {
+            throw new AttributeNotFoundException(attr);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see DynamicMBean#setAttribute(Attribute)
+     */
+    public void setAttribute(Attribute attr) throws AttributeNotFoundException {
+        throw new AttributeNotFoundException(attr.getName());
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see DynamicMBean#invoke(String, Object[], String[])
+     */
+    public Object invoke(String actionName, Object[] params, String[] signature)
+            throws ReflectionException {
+        throw new ReflectionException(new NoSuchMethodException(actionName),
+                actionName);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see DynamicMBean#getMBeanInfo()
+     */
+    public MBeanInfo getMBeanInfo() {
+        return MBEAN_INFO;
+    }
 }
diff --git a/bindings/java/src/org/hyperic/sigar/jmx/SigarCpuInfo.java b/bindings/java/src/org/hyperic/sigar/jmx/SigarCpuInfo.java
index de051937..500ebed1 100644
--- a/bindings/java/src/org/hyperic/sigar/jmx/SigarCpuInfo.java
+++ b/bindings/java/src/org/hyperic/sigar/jmx/SigarCpuInfo.java
@@ -34,269 +34,253 @@ import org.hyperic.sigar.SigarException;
  * package. Provides an OpenMBean conform implementation.
  * 
  * @author Bjoern Martin
- * @since 1.4 (2007-04)
+ * @since 1.5
  */
 public class SigarCpuInfo extends AbstractMBean {
 
-	private static final String MBEAN_TYPE = "CpuInfoList";
+    private static final String MBEAN_TYPE = "CpuInfoList";
 
-	private static final MBeanInfo MBEAN_INFO;
-	
-	private static final MBeanAttributeInfo MBEAN_ATTR_CPUINDEX;
+    private static final MBeanInfo MBEAN_INFO;
 
-	private static final MBeanAttributeInfo MBEAN_ATTR_CACHESIZE;
+    private static final MBeanAttributeInfo MBEAN_ATTR_CPUINDEX;
 
-	private static final MBeanAttributeInfo MBEAN_ATTR_MHZ;
+    private static final MBeanAttributeInfo MBEAN_ATTR_CACHESIZE;
 
-	private static final MBeanAttributeInfo MBEAN_ATTR_MODEL;
+    private static final MBeanAttributeInfo MBEAN_ATTR_MHZ;
 
-	private static final MBeanAttributeInfo MBEAN_ATTR_VENDOR;
+    private static final MBeanAttributeInfo MBEAN_ATTR_MODEL;
 
-	private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX;
+    private static final MBeanAttributeInfo MBEAN_ATTR_VENDOR;
 
-	private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX_SIGAR;
+    private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX;
 
-	private static final MBeanParameterInfo MBEAN_PARAM_CPUINDEX;
+    private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX_SIGAR;
 
-	private static final MBeanParameterInfo MBEAN_PARAM_SIGAR;
-	
-	static {
-		MBEAN_ATTR_CPUINDEX = new MBeanAttributeInfo(
-				"CpuIndex", "int",
-				"The index of the CPU, typically starting at 0",
-				true, false, false);
-		MBEAN_ATTR_CACHESIZE = new MBeanAttributeInfo(
-				"CacheSize", "long",
-				"The cache size of the CPU, in [byte]",
-				true, false, false);
-		MBEAN_ATTR_MHZ = new MBeanAttributeInfo(
-				"Mhz", "int",
-				"The clock speed of the CPU, in [MHz]",
-				true, false, false);
-		MBEAN_ATTR_MODEL = new MBeanAttributeInfo(
-				"Model", "java.lang.String",
-				"The CPU model reported",
-				true, false, false);
-		MBEAN_ATTR_VENDOR = new MBeanAttributeInfo(
-				"Vendor", "java.lang.String",
-				"The CPU vendor reported",
-				true, false, false);
-		MBEAN_PARAM_CPUINDEX = new MBeanParameterInfo(
-				"cpuIndex", "int",
-				"The index of the CPU to read data for. Must be >= 0 " +
-				"and not exceed the CPU count of the system");
-		MBEAN_PARAM_SIGAR = new MBeanParameterInfo(
-				"sigar", Sigar.class.getName(),
-				"The Sigar instance to use to fetch data from");
-		MBEAN_CONSTR_CPUINDEX = new MBeanConstructorInfo(
-				SigarCpuInfo.class.getName(),
-				"Creates a new instance for the CPU index specified, " +
-				"using a new Sigar instance to fetch the data. " +
-				"Fails if the CPU index is out of range.",
-				new MBeanParameterInfo[]{
-						MBEAN_PARAM_CPUINDEX});
-		MBEAN_CONSTR_CPUINDEX_SIGAR = new MBeanConstructorInfo(
-				SigarCpuInfo.class.getName(),
-				"Creates a new instance for the CPU index specified, " +
-				"using the Sigar instance specified to fetch the data. " +
-				"Fails if the CPU index is out of range.",
-				new MBeanParameterInfo[]{
-					MBEAN_PARAM_SIGAR,
-					MBEAN_PARAM_CPUINDEX});
-		MBEAN_INFO = new MBeanInfo(
-				SigarCpuInfo.class.getName(),
-				"Sigar CPU Info MBean, provides overall information for a " +
-				"single CPU. This information only changes if, for example, " +
-				"a CPU is reducing its clock frequency or shutting down " +
-				"part of its cache. Subsequent requests are satisfied from " +
-				"within a cache that invalidates after 30 seconds.",
-				new MBeanAttributeInfo[]{
-					MBEAN_ATTR_CPUINDEX, 
-					MBEAN_ATTR_CACHESIZE, 
-					MBEAN_ATTR_MHZ, 
-					MBEAN_ATTR_MODEL, 
-					MBEAN_ATTR_VENDOR}, 
-				new MBeanConstructorInfo[]{
-					MBEAN_CONSTR_CPUINDEX,
-					MBEAN_CONSTR_CPUINDEX_SIGAR},
-					null, null);
-		
-	}
-	
-	/**
-	 * Index of the CPU processed by the instance.
-	 */
-	private int cpuIndex;
+    private static final MBeanParameterInfo MBEAN_PARAM_CPUINDEX;
 
-	/**
-	 * Object name this instance will give itself when being registered to an 
-	 * MBeanServer.
-	 */
-	private String objectName;
+    private static final MBeanParameterInfo MBEAN_PARAM_SIGAR;
 
-	/**
-	 * Creates a new instance for the CPU index specified, using a new Sigar 
-	 * instance to fetch the data. Fails if the CPU index is out of range.
-	 * 
-	 * @param cpuIndex The index of the CPU to read data for. Must be 
-	 * 		>= 0 and not exceed the CPU count of the system.
-	 * 
-	 * @throws IllegalArgumentException If the CPU index is out of range or 
-	 * 		an unexpected Sigar error occurs
-	 */
-	public SigarCpuInfo(int index) throws IllegalArgumentException {
-		this(new Sigar(), index);
-	}
+    static {
+        MBEAN_ATTR_CPUINDEX = new MBeanAttributeInfo("CpuIndex", "int",
+                "The index of the CPU, typically starting at 0", true, false,
+                false);
+        MBEAN_ATTR_CACHESIZE = new MBeanAttributeInfo("CacheSize", "long",
+                "The cache size of the CPU, in [byte]", true, false, false);
+        MBEAN_ATTR_MHZ = new MBeanAttributeInfo("Mhz", "int",
+                "The clock speed of the CPU, in [MHz]", true, false, false);
+        MBEAN_ATTR_MODEL = new MBeanAttributeInfo("Model", "java.lang.String",
+                "The CPU model reported", true, false, false);
+        MBEAN_ATTR_VENDOR = new MBeanAttributeInfo("Vendor",
+                "java.lang.String", "The CPU vendor reported", true, false,
+                false);
+        MBEAN_PARAM_CPUINDEX = new MBeanParameterInfo("cpuIndex", "int",
+                "The index of the CPU to read data for. Must be >= 0 "
+                        + "and not exceed the CPU count of the system");
+        MBEAN_PARAM_SIGAR = new MBeanParameterInfo("sigar", Sigar.class
+                .getName(), "The Sigar instance to use to fetch data from");
+        MBEAN_CONSTR_CPUINDEX = new MBeanConstructorInfo(SigarCpuInfo.class
+                .getName(),
+                "Creates a new instance for the CPU index specified, "
+                        + "using a new Sigar instance to fetch the data. "
+                        + "Fails if the CPU index is out of range.",
+                new MBeanParameterInfo[] { MBEAN_PARAM_CPUINDEX });
+        MBEAN_CONSTR_CPUINDEX_SIGAR = new MBeanConstructorInfo(
+                SigarCpuInfo.class.getName(),
+                "Creates a new instance for the CPU index specified, "
+                        + "using the Sigar instance specified to fetch the data. "
+                        + "Fails if the CPU index is out of range.",
+                new MBeanParameterInfo[] { MBEAN_PARAM_SIGAR,
+                        MBEAN_PARAM_CPUINDEX });
+        MBEAN_INFO = new MBeanInfo(
+                SigarCpuInfo.class.getName(),
+                "Sigar CPU Info MBean, provides overall information for a "
+                        + "single CPU. This information only changes if, for example, "
+                        + "a CPU is reducing its clock frequency or shutting down "
+                        + "part of its cache. Subsequent requests are satisfied from "
+                        + "within a cache that invalidates after 30 seconds.",
+                new MBeanAttributeInfo[] { MBEAN_ATTR_CPUINDEX,
+                        MBEAN_ATTR_CACHESIZE, MBEAN_ATTR_MHZ, MBEAN_ATTR_MODEL,
+                        MBEAN_ATTR_VENDOR }, new MBeanConstructorInfo[] {
+                        MBEAN_CONSTR_CPUINDEX, MBEAN_CONSTR_CPUINDEX_SIGAR },
+                null, null);
 
-	/**
-	 * Creates a new instance for the CPU index specified, using the Sigar 
-	 * instance specified to fetch the data. Fails if the CPU index is out 
-	 * of range.
-	 * 
-	 * @param sigar The Sigar instance to use to fetch data from
-	 * @param cpuIndex The index of the CPU to read data for. Must be 
-	 * 		>= 0 and not exceed the CPU count of the system.
-	 * 
-	 * @throws IllegalArgumentException If the CPU index is out of range or 
-	 * 		an unexpected Sigar error occurs
-	 */
-	public SigarCpuInfo(Sigar sigar, int index) {
-		super(sigar, DEFAULT);
+    }
 
-		// check index
-		if (index < 0)
-			throw new IllegalArgumentException(
-					"CPU index has to be non-negative: " + index);
-		try {
-			int cpuCount;
-			if ((cpuCount = sigar.getCpuInfoList().length) < index)
-				throw new IllegalArgumentException(
-						"CPU index out of range (found " + cpuCount + " CPU(s)): " + index);
-			
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-		
-		// all fine
-		this.cpuIndex = index;
-		this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" 
-		+ MBEAN_ATTR_TYPE + "=CpuInfo," 
-		+ MBEAN_ATTR_CPUINDEX.getName().substring(0, 1).toLowerCase() 
-		+ MBEAN_ATTR_CPUINDEX.getName().substring(1) + "=" + cpuIndex;
-	}
+    /**
+     * Index of the CPU processed by the instance.
+     */
+    private int cpuIndex;
 
-	/**
-	 * Object name this instance will give itself when being registered to an 
-	 * MBeanServer.
-	 */
-	public String getObjectName() {
-		return this.objectName;
-	}
-	
-	/** 
-	 * @return The index of the CPU, typically starting at 0
-	 */
-	public int getCpuIndex() {
-		return this.cpuIndex;
-	}
-	
-	/**
-	 * @return The cache size of the CPU, in [byte]
-	 */
-	public long getCacheSize() {
-		try {
-			return sigar.getCpuInfoList()[this.cpuIndex].getCacheSize();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+    /**
+     * Object name this instance will give itself when being registered to an 
+     * MBeanServer.
+     */
+    private String objectName;
 
-	/**
-	 * @return The clock speed of the CPU, in [MHz]
-	 */
-	public int getMhz() {
-		try {
-			return sigar.getCpuInfoList()[this.cpuIndex].getMhz();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+    /**
+     * Creates a new instance for the CPU index specified, using a new Sigar 
+     * instance to fetch the data. Fails if the CPU index is out of range.
+     * 
+     * @param cpuIndex The index of the CPU to read data for. Must be 
+     *         >= 0 and not exceed the CPU count of the system.
+     * 
+     * @throws IllegalArgumentException If the CPU index is out of range or 
+     *         an unexpected Sigar error occurs
+     */
+    public SigarCpuInfo(int index) throws IllegalArgumentException {
+        this(new Sigar(), index);
+    }
 
-	/**
-	 * @return The CPU model reported
-	 */
-	public String getModel() {
-		try {
-			return sigar.getCpuInfoList()[this.cpuIndex].getModel();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+    /**
+     * Creates a new instance for the CPU index specified, using the Sigar 
+     * instance specified to fetch the data. Fails if the CPU index is out 
+     * of range.
+     * 
+     * @param sigar The Sigar instance to use to fetch data from
+     * @param cpuIndex The index of the CPU to read data for. Must be 
+     *         >= 0 and not exceed the CPU count of the system.
+     * 
+     * @throws IllegalArgumentException If the CPU index is out of range or 
+     *         an unexpected Sigar error occurs
+     */
+    public SigarCpuInfo(Sigar sigar, int index) {
+        super(sigar, DEFAULT);
 
-	/**
-	 * @return The CPU vendor reported
-	 */
-	public String getVendor() {
-		try {
-			return sigar.getCpuInfoList()[this.cpuIndex].getVendor();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+        // check index
+        if (index < 0)
+            throw new IllegalArgumentException(
+                    "CPU index has to be non-negative: " + index);
+        try {
+            int cpuCount;
+            if ((cpuCount = sigar.getCpuInfoList().length) < index)
+                throw new IllegalArgumentException(
+                        "CPU index out of range (found " + cpuCount
+                                + " CPU(s)): " + index);
 
-	
-	
-	// -------
-	// Implementation of the DynamicMBean interface
-	// -------
-	
-	/*
-	 * (non-Javadoc)
-	 * @see DynamicMBean#getAttribute(String)
-	 */
-	public Object getAttribute(String attr) throws AttributeNotFoundException {
-		
-		if (MBEAN_ATTR_CACHESIZE.getName().equals(attr)) {
-			return new Long(getCacheSize());
-			
-		} else if (MBEAN_ATTR_CPUINDEX.getName().equals(attr)) {
-			return new Integer(getCpuIndex());
-			
-		} else if (MBEAN_ATTR_MHZ.getName().equals(attr)) {
-			return new Integer(getMhz());
-			
-		} else if (MBEAN_ATTR_MODEL.getName().equals(attr)) {
-			return getModel();
-			
-		} else if (MBEAN_ATTR_VENDOR.getName().equals(attr)) {
-			return getVendor();
-			
-		} else {
-			throw new AttributeNotFoundException(attr);
-		}
-	}
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
 
-	/*
-	 * (non-Javadoc)
-	 * @see DynamicMBean#setAttribute(Attribute)
-	 */
-	public void setAttribute(Attribute attr) throws AttributeNotFoundException {
-		throw new AttributeNotFoundException(attr.getName());
-	}
+        // all fine
+        this.cpuIndex = index;
+        this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" + MBEAN_ATTR_TYPE
+                + "=CpuInfo,"
+                + MBEAN_ATTR_CPUINDEX.getName().substring(0, 1).toLowerCase()
+                + MBEAN_ATTR_CPUINDEX.getName().substring(1) + "=" + cpuIndex;
+    }
 
-	/*
-	 * (non-Javadoc)
-	 * @see DynamicMBean#invoke(String, Object[], String[])
-	 */
-	public Object invoke(String actionName, Object[] params, String[] signature) throws ReflectionException {
-		throw new ReflectionException(new NoSuchMethodException(actionName), actionName);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see DynamicMBean#getMBeanInfo()
-	 */
-	public MBeanInfo getMBeanInfo() {
-		return MBEAN_INFO;
-	}
+    /**
+     * Object name this instance will give itself when being registered to an 
+     * MBeanServer.
+     */
+    public String getObjectName() {
+        return this.objectName;
+    }
+
+    /** 
+     * @return The index of the CPU, typically starting at 0
+     */
+    public int getCpuIndex() {
+        return this.cpuIndex;
+    }
+
+    /**
+     * @return The cache size of the CPU, in [byte]
+     */
+    public long getCacheSize() {
+        try {
+            return sigar.getCpuInfoList()[this.cpuIndex].getCacheSize();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
+
+    /**
+     * @return The clock speed of the CPU, in [MHz]
+     */
+    public int getMhz() {
+        try {
+            return sigar.getCpuInfoList()[this.cpuIndex].getMhz();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
+
+    /**
+     * @return The CPU model reported
+     */
+    public String getModel() {
+        try {
+            return sigar.getCpuInfoList()[this.cpuIndex].getModel();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
+
+    /**
+     * @return The CPU vendor reported
+     */
+    public String getVendor() {
+        try {
+            return sigar.getCpuInfoList()[this.cpuIndex].getVendor();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
+
+    // -------
+    // Implementation of the DynamicMBean interface
+    // -------
+
+    /*
+     * (non-Javadoc)
+     * @see DynamicMBean#getAttribute(String)
+     */
+    public Object getAttribute(String attr) throws AttributeNotFoundException {
+
+        if (MBEAN_ATTR_CACHESIZE.getName().equals(attr)) {
+            return new Long(getCacheSize());
+
+        } else if (MBEAN_ATTR_CPUINDEX.getName().equals(attr)) {
+            return new Integer(getCpuIndex());
+
+        } else if (MBEAN_ATTR_MHZ.getName().equals(attr)) {
+            return new Integer(getMhz());
+
+        } else if (MBEAN_ATTR_MODEL.getName().equals(attr)) {
+            return getModel();
+
+        } else if (MBEAN_ATTR_VENDOR.getName().equals(attr)) {
+            return getVendor();
+
+        } else {
+            throw new AttributeNotFoundException(attr);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see DynamicMBean#setAttribute(Attribute)
+     */
+    public void setAttribute(Attribute attr) throws AttributeNotFoundException {
+        throw new AttributeNotFoundException(attr.getName());
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see DynamicMBean#invoke(String, Object[], String[])
+     */
+    public Object invoke(String actionName, Object[] params, String[] signature)
+            throws ReflectionException {
+        throw new ReflectionException(new NoSuchMethodException(actionName),
+                actionName);
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see DynamicMBean#getMBeanInfo()
+     */
+    public MBeanInfo getMBeanInfo() {
+        return MBEAN_INFO;
+    }
 }
diff --git a/bindings/java/src/org/hyperic/sigar/jmx/SigarCpuPerc.java b/bindings/java/src/org/hyperic/sigar/jmx/SigarCpuPerc.java
index e3aec998..f53682b2 100644
--- a/bindings/java/src/org/hyperic/sigar/jmx/SigarCpuPerc.java
+++ b/bindings/java/src/org/hyperic/sigar/jmx/SigarCpuPerc.java
@@ -34,312 +34,300 @@ import org.hyperic.sigar.SigarException;
  * package. Provides an OpenMBean conform implementation.
>= 0 and not exceed the CPU count of the system.
-	 * 
-	 * @throws IllegalArgumentException If the CPU index is out of range or 
-	 * 		an unexpected Sigar error occurs
-	 */
-	public SigarCpuPerc(int index) {
-		this(new Sigar(), index);
-	}
+    /**
+     * Index of the CPU processed by the instance.
+     */
+    private int cpuIndex;
 
-	/**
-	 * Creates a new instance for the CPU index specified, using the Sigar 
-	 * instance specified to fetch the data. Fails if the CPU index is out 
-	 * of range.
-	 * 
-	 * @param sigar The Sigar instance to use to fetch data from
-	 * @param cpuIndex The index of the CPU to read data for. Must be 
-	 * 		>= 0 and not exceed the CPU count of the system.
-	 * 
-	 * @throws IllegalArgumentException If the CPU index is out of range or 
-	 * 		an unexpected Sigar error occurs
-	 */
-	public SigarCpuPerc(Sigar sigar, int index) {
-		super(sigar, CACHED_5SEC);
+    /**
+     * Object name this instance will give itself when being registered to an 
+     * MBeanServer.
+     */
+    private String objectName;
 
-		// check index
-		if (index < 0)
-			throw new IllegalArgumentException(
-					"CPU index has to be non-negative: " + index);
-		try {
-			int cpuCount;
-			if ((cpuCount = sigar.getCpuPercList().length) < index)
-				throw new IllegalArgumentException(
-						"CPU index out of range (found " + cpuCount
-								+ " CPU(s)): " + index);
+    /**
+     * Creates a new instance for the CPU index specified, using a new Sigar 
+     * instance to fetch the data. Fails if the CPU index is out of range.
+     * 
+     * @param cpuIndex The index of the CPU to read data for. Must be 
+     *         >= 0 and not exceed the CPU count of the system.
+     * 
+     * @throws IllegalArgumentException If the CPU index is out of range or 
+     *         an unexpected Sigar error occurs
+     */
+    public SigarCpuPerc(int index) {
+        this(new Sigar(), index);
+    }
 
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
+    /**
+     * Creates a new instance for the CPU index specified, using the Sigar 
+     * instance specified to fetch the data. Fails if the CPU index is out 
+     * of range.
+     * 
+     * @param sigar The Sigar instance to use to fetch data from
+     * @param cpuIndex The index of the CPU to read data for. Must be 
+     *         >= 0 and not exceed the CPU count of the system.
+     * 
+     * @throws IllegalArgumentException If the CPU index is out of range or 
+     *         an unexpected Sigar error occurs
+     */
+    public SigarCpuPerc(Sigar sigar, int index) {
+        super(sigar, CACHED_5SEC);
 
-		// all fine
-		this.cpuIndex = index;
-		this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" 
-				+ MBEAN_ATTR_TYPE + "=CpuPerc," 
-				+ MBEAN_ATTR_CPUINDEX.getName().substring(0, 1).toLowerCase() 
-				+ MBEAN_ATTR_CPUINDEX.getName().substring(1) + "=" + cpuIndex;
-	}
+        // check index
+        if (index < 0)
+            throw new IllegalArgumentException(
+                    "CPU index has to be non-negative: " + index);
+        try {
+            int cpuCount;
+            if ((cpuCount = sigar.getCpuPercList().length) < index)
+                throw new IllegalArgumentException(
+                        "CPU index out of range (found " + cpuCount
+                                + " CPU(s)): " + index);
 
-	/**
-	 * Object name this instance will give itself when being registered to an 
-	 * MBeanServer.
-	 */
-	public String getObjectName() {
-		return this.objectName;
-	}
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
 
-	/** 
-	 * @return The index of the CPU, typically starting at 0
-	 */
-	public int getCpuIndex() {
-		return this.cpuIndex;
-	}
+        // all fine
+        this.cpuIndex = index;
+        this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" + MBEAN_ATTR_TYPE
+                + "=CpuPerc,"
+                + MBEAN_ATTR_CPUINDEX.getName().substring(0, 1).toLowerCase()
+                + MBEAN_ATTR_CPUINDEX.getName().substring(1) + "=" + cpuIndex;
+    }
 
-	/**
-	 * @return The total time of the CPU, as a fraction of 1
-	 */
-	public double getCombined() {
-		try {
-			return sigar.getCpuPercList()[this.cpuIndex].getCombined();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+    /**
+     * Object name this instance will give itself when being registered to an 
+     * MBeanServer.
+     */
+    public String getObjectName() {
+        return this.objectName;
+    }
 
-	/**
-	 * @return The idle time of the CPU, as a fraction of 1
-	 */
-	public double getIdle() {
-		try {
-			return sigar.getCpuPercList()[this.cpuIndex].getIdle();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+    /** 
+     * @return The index of the CPU, typically starting at 0
+     */
+    public int getCpuIndex() {
+        return this.cpuIndex;
+    }
 
-	/**
-	 * @return The time of the CPU spent on nice priority, as a fraction of 1
-	 */
-	public double getNice() {
-		try {
-			return sigar.getCpuPercList()[this.cpuIndex].getNice();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+    /**
+     * @return The total time of the CPU, as a fraction of 1
+     */
+    public double getCombined() {
+        try {
+            return sigar.getCpuPercList()[this.cpuIndex].getCombined();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
 
-	/**
-	 * @return The time of the CPU used by the system, as a fraction of 1
-	 */
-	public double getSys() {
-		try {
-			return sigar.getCpuPercList()[this.cpuIndex].getSys();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+    /**
+     * @return The idle time of the CPU, as a fraction of 1
+     */
+    public double getIdle() {
+        try {
+            return sigar.getCpuPercList()[this.cpuIndex].getIdle();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
 
-	/**
-	 * @return The time of the CPU used by user processes, as a fraction of 1
-	 */
-	public double getUser() {
-		try {
-			return sigar.getCpuPercList()[this.cpuIndex].getUser();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+    /**
+     * @return The time of the CPU spent on nice priority, as a fraction of 1
+     */
+    public double getNice() {
+        try {
+            return sigar.getCpuPercList()[this.cpuIndex].getNice();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
 
-	/**
-	 * @return The time the CPU had to wait for data to be loaded, as a fraction of 1
-	 */
-	public double getWait() {
-		try {
-			return sigar.getCpuPercList()[this.cpuIndex].getWait();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+    /**
+     * @return The time of the CPU used by the system, as a fraction of 1
+     */
+    public double getSys() {
+        try {
+            return sigar.getCpuPercList()[this.cpuIndex].getSys();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
 
-	
-	
-	// -------
-	// Implementation of the DynamicMBean interface
-	// -------
-	
-	/*
-	 * (non-Javadoc)
-	 * @see DynamicMBean#getAttribute(String)
-	 */
-	public Object getAttribute(String attr) throws AttributeNotFoundException {
-		
-		if (MBEAN_ATTR_COMBINED.getName().equals(attr)) {
-			return new Double(getCombined());
-		
-		} else if (MBEAN_ATTR_CPUINDEX.getName().equals(attr)) {
-			return new Integer(getCpuIndex());
-		
-		} else if (MBEAN_ATTR_IDLE.getName().equals(attr)) {
-			return new Double(getIdle());
-			
-		} else if (MBEAN_ATTR_NICE.getName().equals(attr)) {
-			return new Double(getNice());
-			
-		} else if (MBEAN_ATTR_SYS.getName().equals(attr)) {
-			return new Double(getSys());
-			
-		} else if (MBEAN_ATTR_USER.getName().equals(attr)) {
-			return new Double(getUser());
-			
-		} else if (MBEAN_ATTR_WAIT.getName().equals(attr)) {
-			return new Double(getWait());
-			
-		} else {
-			throw new AttributeNotFoundException(attr);
-		}
-	}
+    /**
+     * @return The time of the CPU used by user processes, as a fraction of 1
+     */
+    public double getUser() {
+        try {
+            return sigar.getCpuPercList()[this.cpuIndex].getUser();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
 
-	/*
-	 * (non-Javadoc)
-	 * @see DynamicMBean#setAttribute(Attribute)
-	 */
-	public void setAttribute(Attribute attr) throws AttributeNotFoundException {
-		throw new AttributeNotFoundException(attr.getName());
-	}
+    /**
+     * @return The time the CPU had to wait for data to be loaded, as a fraction of 1
+     */
+    public double getWait() {
+        try {
+            return sigar.getCpuPercList()[this.cpuIndex].getWait();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
 
-	/*
-	 * (non-Javadoc)
-	 * @see DynamicMBean#invoke(String, Object[], String[])
-	 */
-	public Object invoke(String actionName, Object[] params, String[] signature) throws ReflectionException {
-		throw new ReflectionException(new NoSuchMethodException(actionName), actionName);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see DynamicMBean#getMBeanInfo()
-	 */
-	public MBeanInfo getMBeanInfo() {
-		return MBEAN_INFO;
-	}
+    // -------
+    // Implementation of the DynamicMBean interface
+    // -------
+
+    /*
+     * (non-Javadoc)
+     * @see DynamicMBean#getAttribute(String)
+     */
+    public Object getAttribute(String attr) throws AttributeNotFoundException {
+
+        if (MBEAN_ATTR_COMBINED.getName().equals(attr)) {
+            return new Double(getCombined());
+
+        } else if (MBEAN_ATTR_CPUINDEX.getName().equals(attr)) {
+            return new Integer(getCpuIndex());
+
+        } else if (MBEAN_ATTR_IDLE.getName().equals(attr)) {
+            return new Double(getIdle());
+
+        } else if (MBEAN_ATTR_NICE.getName().equals(attr)) {
+            return new Double(getNice());
+
+        } else if (MBEAN_ATTR_SYS.getName().equals(attr)) {
+            return new Double(getSys());
+
+        } else if (MBEAN_ATTR_USER.getName().equals(attr)) {
+            return new Double(getUser());
+
+        } else if (MBEAN_ATTR_WAIT.getName().equals(attr)) {
+            return new Double(getWait());
+
+        } else {
+            throw new AttributeNotFoundException(attr);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see DynamicMBean#setAttribute(Attribute)
+     */
+    public void setAttribute(Attribute attr) throws AttributeNotFoundException {
+        throw new AttributeNotFoundException(attr.getName());
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see DynamicMBean#invoke(String, Object[], String[])
+     */
+    public Object invoke(String actionName, Object[] params, String[] signature)
+            throws ReflectionException {
+        throw new ReflectionException(new NoSuchMethodException(actionName),
+                actionName);
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see DynamicMBean#getMBeanInfo()
+     */
+    public MBeanInfo getMBeanInfo() {
+        return MBEAN_INFO;
+    }
 }
diff --git a/bindings/java/src/org/hyperic/sigar/jmx/SigarLoadAverage.java b/bindings/java/src/org/hyperic/sigar/jmx/SigarLoadAverage.java
new file mode 100644
index 00000000..586f419e
--- /dev/null
+++ b/bindings/java/src/org/hyperic/sigar/jmx/SigarLoadAverage.java
@@ -0,0 +1,263 @@
+/*
+ * Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc.
+ * This file is part of SIGAR.
+ * 
+ * SIGAR is free software; you can redistribute it and/or modify
+ * it under the terms version 2 of the GNU General Public License as
+ * published by the Free Software Foundation. This program is distributed
+ * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
+ * even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA.
+ */
+
+package org.hyperic.sigar.jmx;
+
+import javax.management.Attribute;
+import javax.management.AttributeNotFoundException;
+import javax.management.MBeanAttributeInfo;
+import javax.management.MBeanConstructorInfo;
+import javax.management.MBeanInfo;
+import javax.management.MBeanParameterInfo;
+import javax.management.ReflectionException;
+
+import org.hyperic.sigar.Sigar;
+import org.hyperic.sigar.SigarException;
+import org.hyperic.sigar.SigarNotImplementedException;
+
+/**
+ * Sigar JMX MBean implementation for the LoadAverage information
+ * package. Provides an OpenMBean conform implementation.
+ * 
+ * @author Bjoern Martin
+ * @since 1.5
+ */
+public class SigarLoadAverage extends AbstractMBean {
+
+    private static final String MBEAN_TYPE = "LoadAverage";
+
+    /**
+     * Returned if {@link Sigar#getLoadAverage()}} is detected to be not
+     * implemented on the platform.
+     * 
+     * @see #notImplemented
+     */
+    private static final double NOT_IMPLEMENTED_LOAD_VALUE = -1.0d;
+
+    private static final MBeanInfo MBEAN_INFO;
+
+    private static final MBeanAttributeInfo MBEAN_ATTR_LAST1MIN;
+
+    private static final MBeanAttributeInfo MBEAN_ATTR_LAST5MIN;
+
+    private static final MBeanAttributeInfo MBEAN_ATTR_LAST15MIN;
+
+    private static final MBeanConstructorInfo MBEAN_CONSTR_SIGAR;
+
+    private static MBeanParameterInfo MBEAN_PARAM_SIGAR;
+
+    static {
+        MBEAN_ATTR_LAST1MIN = new MBeanAttributeInfo(
+                "LastMinute",
+                "double",
+                "The load average in the last minute, as a fraction of 1, or "
+                        + "-1.0 if the load cannot be determined on this platform",
+                true, false, false);
+        MBEAN_ATTR_LAST5MIN = new MBeanAttributeInfo(
+                "LastFiveMinutes",
+                "double",
+                "The load average over the last five minutes, as a fraction "
+                        + "of 1, or -1.0 if the load cannot be determined on this platform",
+                true, false, false);
+        MBEAN_ATTR_LAST15MIN = new MBeanAttributeInfo(
+                "Last15Minutes",
+                "double",
+                "The load average over the last 15 minutes, as a fraction of "
+                        + "1, or -1.0 if the load cannot be determined on this platform",
+                true, false, false);
+
+        MBEAN_PARAM_SIGAR = new MBeanParameterInfo("sigar", Sigar.class
+                .getName(), "The Sigar instance to use to fetch data from");
+
+        MBEAN_CONSTR_SIGAR = new MBeanConstructorInfo(
+                SigarLoadAverage.class.getName(),
+                "Creates a new instance, using the Sigar instance specified "
+                        + "to fetch the data. Fails if the CPU index is out of range.",
+                new MBeanParameterInfo[] { MBEAN_PARAM_SIGAR });
+        MBEAN_INFO = new MBeanInfo(
+                SigarLoadAverage.class.getName(),
+                "Sigar load average MBean. Provides load averages of the "
+                        + "system over the last one, five and 15 minutes. Due to the "
+                        + "long term character of that information, the fetch is done "
+                        + "using a Sigar proxy cache with a timeout of 30 seconds.",
+                new MBeanAttributeInfo[] { MBEAN_ATTR_LAST1MIN,
+                        MBEAN_ATTR_LAST5MIN, MBEAN_ATTR_LAST15MIN },
+                new MBeanConstructorInfo[] { MBEAN_CONSTR_SIGAR }, null, null);
+
+    }
+
+    /**
+     * Object name this instance will give itself when being registered to an
+     * MBeanServer.
+     */
+    private final String objectName;
+
+    /**
+     * Set true when the load average fetch failed with a 
+     * SigarException that indicates the method is not implemented.
+     * Any subsequent call to this instance will then be answered with 
+     * {@link #NOT_IMPLEMENTED_LOAD_VALUE}.
+     * 
FIXME : This is a workaround and should be replaced by something 
+     * more stable, as the code setting this member true relies on 
+     * a substring being present within the exception. A proposal was made at
+     * issue SIGAR-52.
+     * 
-1.0d if the load cannot be determined on this platform
+     */
+    public double getLastMinute() {
+        try {
+            return sigarImpl.getLoadAverage()[0];
+            
+        } catch (SigarNotImplementedException e) {
+            return NOT_IMPLEMENTED_LOAD_VALUE;
+            
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
+
+    /**
+     * @return The load average over the last five minutes, as a fraction of 1, 
+     *      or -1.0d if the load cannot be determined on this 
+     *      platform
+     */
+    public double getLastFiveMinutes() {
+        try {
+            return sigarImpl.getLoadAverage()[1];
+            
+        } catch (SigarNotImplementedException e) {
+            return NOT_IMPLEMENTED_LOAD_VALUE;
+            
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
+
+    /**
+     * @return The load average over the last 15 minutes, as a fraction of 1, or 
+     *      -1.0d if the load cannot be determined on this platform
+     */
+    public double getLast15Minutes() {
+        try {
+            return sigarImpl.getLoadAverage()[2];
+            
+        } catch (SigarNotImplementedException e) {
+            return NOT_IMPLEMENTED_LOAD_VALUE;
+            
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
+
+    // -------
+    // Implementation of the DynamicMBean interface
+    // -------
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see DynamicMBean#getAttribute(String)
+     */
+    public Object getAttribute(String attr) throws AttributeNotFoundException {
+
+        if (MBEAN_ATTR_LAST1MIN.getName().equals(attr)) {
+            return new Double(getLastMinute());
+
+        } else if (MBEAN_ATTR_LAST5MIN.getName().equals(attr)) {
+            return new Double(getLastFiveMinutes());
+
+        } else if (MBEAN_ATTR_LAST15MIN.getName().equals(attr)) {
+            return new Double(getLast15Minutes());
+
+        } else {
+            throw new AttributeNotFoundException(attr);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see DynamicMBean#setAttribute(Attribute)
+     */
+    public void setAttribute(Attribute attr) throws AttributeNotFoundException {
+        throw new AttributeNotFoundException(attr.getName());
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see DynamicMBean#invoke(String, Object[], String[])
+     */
+    public Object invoke(String actionName, Object[] params, String[] signature)
+            throws ReflectionException {
+        throw new ReflectionException(new NoSuchMethodException(actionName),
+                actionName);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see DynamicMBean#getMBeanInfo()
+     */
+    public MBeanInfo getMBeanInfo() {
+        return MBEAN_INFO;
+    }
+}
diff --git a/bindings/java/src/org/hyperic/sigar/jmx/SigarMem.java b/bindings/java/src/org/hyperic/sigar/jmx/SigarMem.java
index 13bc1604..bf7c1ea3 100644
--- a/bindings/java/src/org/hyperic/sigar/jmx/SigarMem.java
+++ b/bindings/java/src/org/hyperic/sigar/jmx/SigarMem.java
@@ -35,238 +35,217 @@ import org.hyperic.sigar.SigarException;
  * package. Provides an OpenMBean conform implementation.
  * 
  * @author Bjoern Martin
- * @since 1.4 (2007-04)
+ * @since 1.5
  */
 public class SigarMem extends AbstractMBean {
 
-	private static final String MBEAN_TYPE = "Mem";
+    private static final String MBEAN_TYPE = "Mem";
 
-	private static final MBeanInfo MBEAN_INFO;
-	
-	private static final MBeanAttributeInfo MBEAN_ATTR_ACTUAL_FREE;
+    private static final MBeanInfo MBEAN_INFO;
 
-	private static final MBeanAttributeInfo MBEAN_ATTR_ACTUAL_USED;
+    private static final MBeanAttributeInfo MBEAN_ATTR_ACTUAL_FREE;
 
-	private static final MBeanAttributeInfo MBEAN_ATTR_FREE;
+    private static final MBeanAttributeInfo MBEAN_ATTR_ACTUAL_USED;
 
-	private static final MBeanAttributeInfo MBEAN_ATTR_RAM;
+    private static final MBeanAttributeInfo MBEAN_ATTR_FREE;
 
-	private static final MBeanAttributeInfo MBEAN_ATTR_TOTAL;
+    private static final MBeanAttributeInfo MBEAN_ATTR_RAM;
 
-	private static final MBeanAttributeInfo MBEAN_ATTR_USED;
+    private static final MBeanAttributeInfo MBEAN_ATTR_TOTAL;
 
-	private static final MBeanConstructorInfo MBEAN_CONSTR_SIGAR;
+    private static final MBeanAttributeInfo MBEAN_ATTR_USED;
 
-	private static MBeanParameterInfo MBEAN_PARAM_SIGAR;
-	
-	static {
-		MBEAN_ATTR_ACTUAL_FREE = new MBeanAttributeInfo(
-				"ActualFree", "long",
-				"TODO add proper description here",
-				true, false, false);
-		MBEAN_ATTR_ACTUAL_USED = new MBeanAttributeInfo(
-				"ActualUsed", "long",
-				"TODO add proper description here",
-				true, false, false);
-		MBEAN_ATTR_FREE = new MBeanAttributeInfo(
-				"Free", "long",
-				"TODO add proper description here",
-				true, false, false);
-		MBEAN_ATTR_RAM = new MBeanAttributeInfo(
-				"Ram", "long",
-				"TODO add proper description here",
-				true, false, false);
-		MBEAN_ATTR_TOTAL = new MBeanAttributeInfo(
-				"Total", "long",
-				"TODO add proper description here",
-				true, false, false);
-		MBEAN_ATTR_USED = new MBeanAttributeInfo(
-				"Used", "long",
-				"TODO add proper description here",
-				true, false, false);
-		MBEAN_PARAM_SIGAR = new MBeanParameterInfo(
-				"sigar", Sigar.class.getName(),
-				"The Sigar instance to use to fetch data from");
-		MBEAN_CONSTR_SIGAR = new MBeanConstructorInfo(
-				SigarMem.class.getName(),
-				"Creates a new instance, using the Sigar instance " +
-				"specified to fetch the data.",
-				new MBeanParameterInfo[]{
-						MBEAN_PARAM_SIGAR});
-		MBEAN_INFO = new MBeanInfo(
-				SigarMem.class.getName(),
-				"Sigar Memory MBean, provides raw data for the physical " +
-				"memory installed on the system. Uses an internal cache " +
-				"that invalidates within 500ms, allowing for bulk request " +
-				"being satisfied with a single dataset fetch.",
-				new MBeanAttributeInfo[]{
-					MBEAN_ATTR_ACTUAL_FREE, 
-					MBEAN_ATTR_ACTUAL_USED, 
-					MBEAN_ATTR_FREE, 
-					MBEAN_ATTR_RAM, 
-					MBEAN_ATTR_TOTAL, 
-					MBEAN_ATTR_USED}, 
-				new MBeanConstructorInfo[]{
-					MBEAN_CONSTR_SIGAR},
-					null, null);
-		
-	}
-	
-	/**
-	 * Object name this instance will give itself when being registered to an
-	 * MBeanServer.
-	 */
-	private final String objectName;
+    private static final MBeanConstructorInfo MBEAN_CONSTR_SIGAR;
 
-	/**
-	 * Creates a new instance, using the Sigar instance specified to fetch the
-	 * data.
-	 * 
-	 * @param sigar
-	 *            The Sigar instance to use to fetch data from
-	 * 
-	 * @throws IllegalArgumentException
-	 *             If an unexpected Sigar error occurs
-	 */
-	public SigarMem(Sigar sigar) throws IllegalArgumentException {
-		super(sigar, CACHED_500MS);
+    private static MBeanParameterInfo MBEAN_PARAM_SIGAR;
 
-		this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" + MBEAN_ATTR_TYPE
-				+ "=Memory";
-	}
+    static {
+        MBEAN_ATTR_ACTUAL_FREE = new MBeanAttributeInfo("ActualFree", "long",
+                "TODO add proper description here", true, false, false);
+        MBEAN_ATTR_ACTUAL_USED = new MBeanAttributeInfo("ActualUsed", "long",
+                "TODO add proper description here", true, false, false);
+        MBEAN_ATTR_FREE = new MBeanAttributeInfo("Free", "long",
+                "TODO add proper description here", true, false, false);
+        MBEAN_ATTR_RAM = new MBeanAttributeInfo("Ram", "long",
+                "TODO add proper description here", true, false, false);
+        MBEAN_ATTR_TOTAL = new MBeanAttributeInfo("Total", "long",
+                "TODO add proper description here", true, false, false);
+        MBEAN_ATTR_USED = new MBeanAttributeInfo("Used", "long",
+                "TODO add proper description here", true, false, false);
+        MBEAN_PARAM_SIGAR = new MBeanParameterInfo("sigar", Sigar.class
+                .getName(), "The Sigar instance to use to fetch data from");
+        MBEAN_CONSTR_SIGAR = new MBeanConstructorInfo(SigarMem.class.getName(),
+                "Creates a new instance, using the Sigar instance "
+                        + "specified to fetch the data.",
+                new MBeanParameterInfo[] { MBEAN_PARAM_SIGAR });
+        MBEAN_INFO = new MBeanInfo(
+                SigarMem.class.getName(),
+                "Sigar Memory MBean, provides raw data for the physical "
+                        + "memory installed on the system. Uses an internal cache "
+                        + "that invalidates within 500ms, allowing for bulk request "
+                        + "being satisfied with a single dataset fetch.",
+                new MBeanAttributeInfo[] { MBEAN_ATTR_ACTUAL_FREE,
+                        MBEAN_ATTR_ACTUAL_USED, MBEAN_ATTR_FREE,
+                        MBEAN_ATTR_RAM, MBEAN_ATTR_TOTAL, MBEAN_ATTR_USED },
+                new MBeanConstructorInfo[] { MBEAN_CONSTR_SIGAR }, null, null);
 
-	/**
-	 * Object name this instance will give itself when being registered to an
-	 * MBeanServer.
-	 */
-	public String getObjectName() {
-		return this.objectName;
-	}
+    }
 
-	/**
-	 * @return The actual amount of free physical memory, in [bytes]
-	 */
-	public long getActualFree() {
-		try {
-			return sigar.getMem().getActualFree();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+    /**
+     * Object name this instance will give itself when being registered to an
+     * MBeanServer.
+     */
+    private final String objectName;
 
-	/**
-	 * @return The actual amount of physical memory used, in [bytes]
-	 */
-	public long getActualUsed() {
-		try {
-			return sigar.getMem().getActualUsed();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+    /**
+     * Creates a new instance, using the Sigar instance specified to fetch the
+     * data.
+     * 
+     * @param sigar
+     *            The Sigar instance to use to fetch data from
+     * 
+     * @throws IllegalArgumentException
+     *             If an unexpected Sigar error occurs
+     */
+    public SigarMem(Sigar sigar) throws IllegalArgumentException {
+        super(sigar, CACHED_500MS);
 
-	/**
-	 * @return The amount of free physical memory, in [bytes]
-	 */
-	public long getFree() {
-		try {
-			return sigar.getMem().getFree();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+        this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" + MBEAN_ATTR_TYPE
+                + "=Memory";
+    }
 
-	/**
-	 * @return The amount of physical memory, in [bytes]
-	 */
-	public long getRam() {
-		try {
-			return sigar.getMem().getRam();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+    /**
+     * Object name this instance will give itself when being registered to an
+     * MBeanServer.
+     */
+    public String getObjectName() {
+        return this.objectName;
+    }
 
-	/**
-	 * @return The total amount of physical memory, in [bytes]
-	 */
-	public long getTotal() {
-		try {
-			return sigar.getMem().getTotal();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+    /**
+     * @return The actual amount of free physical memory, in [bytes]
+     */
+    public long getActualFree() {
+        try {
+            return sigar.getMem().getActualFree();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
 
-	/**
-	 * @return The amount of physical memory in use, in [bytes]
-	 */
-	public long getUsed() {
-		try {
-			return sigar.getMem().getUsed();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+    /**
+     * @return The actual amount of physical memory used, in [bytes]
+     */
+    public long getActualUsed() {
+        try {
+            return sigar.getMem().getActualUsed();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
 
-	// -------
-	// Implementation of the DynamicMBean interface
-	// -------
+    /**
+     * @return The amount of free physical memory, in [bytes]
+     */
+    public long getFree() {
+        try {
+            return sigar.getMem().getFree();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see javax.management.DynamicMBean#getAttribute(java.lang.String)
-	 */
-	public Object getAttribute(String attr) throws AttributeNotFoundException,
-			MBeanException, ReflectionException {
-		if (MBEAN_ATTR_ACTUAL_FREE.getName().equals(attr)) {
-			return new Long(getActualFree());
+    /**
+     * @return The amount of physical memory, in [bytes]
+     */
+    public long getRam() {
+        try {
+            return sigar.getMem().getRam();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
 
-		} else if (MBEAN_ATTR_ACTUAL_USED.getName().equals(attr)) {
-			return new Long(getActualUsed());
+    /**
+     * @return The total amount of physical memory, in [bytes]
+     */
+    public long getTotal() {
+        try {
+            return sigar.getMem().getTotal();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
 
-		} else if (MBEAN_ATTR_FREE.getName().equals(attr)) {
-			return new Long(getFree());
+    /**
+     * @return The amount of physical memory in use, in [bytes]
+     */
+    public long getUsed() {
+        try {
+            return sigar.getMem().getUsed();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
 
-		} else if (MBEAN_ATTR_RAM.getName().equals(attr)) {
-			return new Long(getRam());
+    // -------
+    // Implementation of the DynamicMBean interface
+    // -------
 
-		} else if (MBEAN_ATTR_TOTAL.getName().equals(attr)) {
-			return new Long(getTotal());
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.management.DynamicMBean#getAttribute(java.lang.String)
+     */
+    public Object getAttribute(String attr) throws AttributeNotFoundException,
+            MBeanException, ReflectionException {
+        if (MBEAN_ATTR_ACTUAL_FREE.getName().equals(attr)) {
+            return new Long(getActualFree());
 
-		} else if (MBEAN_ATTR_USED.getName().equals(attr)) {
-			return new Long(getUsed());
+        } else if (MBEAN_ATTR_ACTUAL_USED.getName().equals(attr)) {
+            return new Long(getActualUsed());
 
-		} else {
-			throw new AttributeNotFoundException(attr);
-		}
-	}
+        } else if (MBEAN_ATTR_FREE.getName().equals(attr)) {
+            return new Long(getFree());
 
-	/*
-	 * (non-Javadoc)
-	 * @see javax.management.DynamicMBean#setAttribute(javax.management.Attribute)
-	 */
-	public void setAttribute(Attribute attr) throws AttributeNotFoundException {
-		throw new AttributeNotFoundException(attr.getName());
-	}
+        } else if (MBEAN_ATTR_RAM.getName().equals(attr)) {
+            return new Long(getRam());
 
-	/*
-	 * (non-Javadoc)
-	 * @see javax.management.DynamicMBean#invoke(java.lang.String,
-	 *      java.lang.Object[], java.lang.String[])
-	 */
-	public Object invoke(String actionName, Object[] params, String[] signature)
-			throws ReflectionException {
-		throw new ReflectionException(new NoSuchMethodException(actionName),
-				actionName);
-	}
+        } else if (MBEAN_ATTR_TOTAL.getName().equals(attr)) {
+            return new Long(getTotal());
 
-	/*
-	 * (non-Javadoc)
-	 * @see javax.management.DynamicMBean#getMBeanInfo()
-	 */
-	public MBeanInfo getMBeanInfo() {
-		return MBEAN_INFO;
-	}
+        } else if (MBEAN_ATTR_USED.getName().equals(attr)) {
+            return new Long(getUsed());
+
+        } else {
+            throw new AttributeNotFoundException(attr);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see javax.management.DynamicMBean#setAttribute(javax.management.Attribute)
+     */
+    public void setAttribute(Attribute attr) throws AttributeNotFoundException {
+        throw new AttributeNotFoundException(attr.getName());
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see javax.management.DynamicMBean#invoke(java.lang.String,
+     *      java.lang.Object[], java.lang.String[])
+     */
+    public Object invoke(String actionName, Object[] params, String[] signature)
+            throws ReflectionException {
+        throw new ReflectionException(new NoSuchMethodException(actionName),
+                actionName);
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see javax.management.DynamicMBean#getMBeanInfo()
+     */
+    public MBeanInfo getMBeanInfo() {
+        return MBEAN_INFO;
+    }
 }
diff --git a/bindings/java/src/org/hyperic/sigar/jmx/SigarRegistry.java b/bindings/java/src/org/hyperic/sigar/jmx/SigarRegistry.java
index 11a14af9..43fc091f 100644
--- a/bindings/java/src/org/hyperic/sigar/jmx/SigarRegistry.java
+++ b/bindings/java/src/org/hyperic/sigar/jmx/SigarRegistry.java
@@ -41,14 +41,14 @@ import org.hyperic.sigar.SigarException;
  * 
  * Cpu, CpuPerc
-	 *  and CpuInfo. One instance will be registered for each CPU 
-	 *  (core?) found.
-	 */
-	private void registerCpuBeans() {
-		ObjectInstance nextRegistered = null;
-		
-		try {
-			final int cpuCount = sigar.getCpuInfoList().length;
-			for (int i = 0; i < cpuCount; i++) {
-				// add CPU bean
-				SigarCpu nextCpu = new SigarCpu(sigarImpl, i);
-				try {
-					if (!mbeanServer.isRegistered(new ObjectName(nextCpu.getObjectName())))
-						nextRegistered = mbeanServer.registerMBean(nextCpu, null);
-				} catch (Exception e) { // ignore
-				}
-				// add MBean to set of managed beans
-				if (nextRegistered != null)
-					managedBeans.add(nextRegistered.getObjectName());
-				nextRegistered = null;
-				
-				// add CPU percentage bean
-				SigarCpuPerc nextCpuPerc = new SigarCpuPerc(sigarImpl, i);
-				try {
-					if (!mbeanServer.isRegistered(new ObjectName(nextCpuPerc.getObjectName())))
-						nextRegistered = mbeanServer.registerMBean(nextCpuPerc, null);
-				} catch (Exception e) { // ignore
-				}
-				// add MBean to set of managed beans
-				if (nextRegistered != null)
-					managedBeans.add(nextRegistered.getObjectName());
-				nextRegistered = null;
-				
-				// add CPU info bean
-				SigarCpuInfo nextCpuInfo = new SigarCpuInfo(sigarImpl, i);
-				try {
-					if (!mbeanServer.isRegistered(new ObjectName(nextCpuInfo.getObjectName())))
-						nextRegistered = mbeanServer.registerMBean(nextCpuInfo, null);
-				} catch (Exception e) { // ignore
-				}
-				// add MBean to set of managed beans
-				if (nextRegistered != null)
-					managedBeans.add(nextRegistered.getObjectName());
-				nextRegistered = null;
-			}
-			
-		} catch (SigarException e) {
-			throw unexpectedError("CpuInfoList", e);
-		}
-	}
-	
-	/**
-	 * Registers MBeans for the Sigar types Mem and Swap. 
-	 */
-	private void registerMemoryBeans() {
-		
-		ObjectInstance nextRegistered = null;
-		
-		// add physical memory bean
-		SigarMem mem = new SigarMem(sigarImpl);
-		
-		try {
-			if (!mbeanServer.isRegistered(new ObjectName(mem.getObjectName())))
-				nextRegistered = mbeanServer.registerMBean(mem, null);
-		} catch (Exception e) { // ignore
-		}
-		
-		// add MBean to set of managed beans
-		if (nextRegistered != null)
-			managedBeans.add(nextRegistered.getObjectName());
-		nextRegistered = null;
-		
-		// add swap memory bean
-		SigarSwap swap = new SigarSwap(sigarImpl);
-		try {
-			if (!mbeanServer.isRegistered(new ObjectName(swap.getObjectName())))
-				nextRegistered = mbeanServer.registerMBean(swap, null);
-		} catch (Exception e) { // ignore
-			nextRegistered = null;
-		}
-		
-		// add MBean to set of managed beans
-		if (nextRegistered != null)
-			managedBeans.add(nextRegistered.getObjectName());
-		nextRegistered = null;
-	}
-	
-	/**
-	 * Deregisters all Sigar MBeans that were created and registered using this 
-	 * instance. After doing so, a super call is made to satisfy {@link AbstractMBean}.
-	 * @throws Exception 
-	 * 
-	 * @see AbstractMBean#preDeregister()
-	 */
-	public void preDeregister() throws Exception {
-		
-		// count backwards to remove ONs immediately
-		for (int i = managedBeans.size() - 1; i >= 0; i--) {
-			ObjectName next = (ObjectName) managedBeans.remove(i);
-			if (mbeanServer.isRegistered(next)) {
-				try {
-					mbeanServer.unregisterMBean(next);
-				} catch (Exception e) { // ignore
-				}
-			}
-		}
-		
-		// do the super call
-		super.preDeregister();
-	}
+    /**
+     * Creates a new instance of this class. Will create the Sigar instance this 
+     * class uses when constructing other MBeans.
+     */
+    public SigarRegistry() {
+        super(new Sigar(), CACHELESS);
+        this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" + MBEAN_ATTR_TYPE
+                + "=" + MBEAN_TYPE;
+        this.managedBeans = new ArrayList();
+    }
+
+    /* (non-Javadoc)
+     * @see AbstractMBean#getObjectName()
+     */
+    public String getObjectName() {
+        return this.objectName;
+    }
+
+/*  public String listProcesses() {
+        try {
+            final long start = System.currentTimeMillis();
+            long[] ids = sigar.getProcList();
+            StringBuffer procNames = new StringBuffer();
+            for (int i = 0; i < ids.length; i++) {
+                try {
+                    procNames.append(ids[i] + ":" + sigar.getProcExe(ids[i]).getName()).append('\n');
+                } catch (SigarException e) {
+                    procNames.append(ids[i] + ":" + e.getMessage()).append('\n');
+                }
+            }
+            
+            final long end = System.currentTimeMillis();
+            procNames.append("-- Took " + (end-start) + "ms");
+            return procNames.toString();
+
+        } catch (SigarException e) {
+            throw unexpectedError("ProcList", e);
+        }
+    }
+*/
+    /* (non-Javadoc)
+     * @see javax.management.DynamicMBean#getAttribute(java.lang.String)
+     */
+    public Object getAttribute(String attr) throws AttributeNotFoundException {
+        throw new AttributeNotFoundException(attr);
+    }
+
+    /* (non-Javadoc)
+     * @see javax.management.DynamicMBean#setAttribute(javax.management.Attribute)
+     */
+    public void setAttribute(Attribute attr) throws AttributeNotFoundException {
+        throw new AttributeNotFoundException(attr.getName());
+    }
+
+    /* (non-Javadoc)
+     * @see javax.management.DynamicMBean#invoke(java.lang.String, java.lang.Object[], java.lang.String[])
+     */
+    public Object invoke(String action, Object[] params, String[] signatures)
+            throws MBeanException, ReflectionException {
+        
+/*      if (MBEAN_OPER_LISTPROCESSES.getName().equals(action))
+            return listProcesses();
+        
+        else */
+            throw new ReflectionException(new NoSuchMethodException(action), action);
+    }
+
+    /* (non-Javadoc)
+     * @see javax.management.DynamicMBean#getMBeanInfo()
+     */
+    public MBeanInfo getMBeanInfo() {
+        return MBEAN_INFO;
+    }
+
+    // -------
+    // Implementation of the MBeanRegistration interface
+    // -------
+
+    /**
+     * Registers the default set of Sigar MBeans. Before doing so, a super call 
+     * is made to satisfy {@link AbstractMBean}.
+     * 
+     * @see AbstractMBean#postRegister(Boolean)
+     */
+    public void postRegister(Boolean success) {
+
+        super.postRegister(success);
+
+        if (!success.booleanValue())
+            return;
+
+        // get CPUs
+        registerCpuBeans();
+
+        // get memory
+        registerMemoryBeans();
+
+        // get system
+        registerSystemBeans();
+    }
+
+    /**
+     * Registers MBeans for the Sigar types Cpu, CpuPerc
+     *  and CpuInfo. One instance will be registered for each CPU 
+     *  (core?) found.
+     */
+    private void registerCpuBeans() {
+        ObjectInstance nextRegistered = null;
+
+        try {
+            final int cpuCount = sigar.getCpuInfoList().length;
+            for (int i = 0; i < cpuCount; i++) {
+                // add CPU bean
+                SigarCpu nextCpu = new SigarCpu(sigarImpl, i);
+                try {
+                    if (!mbeanServer.isRegistered(new ObjectName(nextCpu
+                            .getObjectName())))
+                        nextRegistered = mbeanServer.registerMBean(nextCpu,
+                                null);
+                } catch (Exception e) { // ignore
+                }
+                // add MBean to set of managed beans
+                if (nextRegistered != null)
+                    managedBeans.add(nextRegistered.getObjectName());
+                nextRegistered = null;
+
+                // add CPU percentage bean
+                SigarCpuPerc nextCpuPerc = new SigarCpuPerc(sigarImpl, i);
+                try {
+                    if (!mbeanServer.isRegistered(new ObjectName(nextCpuPerc
+                            .getObjectName())))
+                        nextRegistered = mbeanServer.registerMBean(nextCpuPerc,
+                                null);
+                } catch (Exception e) { // ignore
+                }
+                // add MBean to set of managed beans
+                if (nextRegistered != null)
+                    managedBeans.add(nextRegistered.getObjectName());
+                nextRegistered = null;
+
+                // add CPU info bean
+                SigarCpuInfo nextCpuInfo = new SigarCpuInfo(sigarImpl, i);
+                try {
+                    if (!mbeanServer.isRegistered(new ObjectName(nextCpuInfo
+                            .getObjectName())))
+                        nextRegistered = mbeanServer.registerMBean(nextCpuInfo,
+                                null);
+                } catch (Exception e) { // ignore
+                }
+                // add MBean to set of managed beans
+                if (nextRegistered != null)
+                    managedBeans.add(nextRegistered.getObjectName());
+                nextRegistered = null;
+            }
+
+        } catch (SigarException e) {
+            throw unexpectedError("CpuInfoList", e);
+        }
+    }
+
+    /**
+     * Registers MBeans for the Sigar types Mem and Swap. 
+     */
+    private void registerMemoryBeans() {
+
+        ObjectInstance nextRegistered = null;
+
+        // add physical memory bean
+        SigarMem mem = new SigarMem(sigarImpl);
+
+        try {
+            if (!mbeanServer.isRegistered(new ObjectName(mem.getObjectName())))
+                nextRegistered = mbeanServer.registerMBean(mem, null);
+        } catch (Exception e) { // ignore
+        }
+
+        // add MBean to set of managed beans
+        if (nextRegistered != null)
+            managedBeans.add(nextRegistered.getObjectName());
+        nextRegistered = null;
+
+        // add swap memory bean
+        SigarSwap swap = new SigarSwap(sigarImpl);
+        try {
+            if (!mbeanServer.isRegistered(new ObjectName(swap.getObjectName())))
+                nextRegistered = mbeanServer.registerMBean(swap, null);
+        } catch (Exception e) { // ignore
+            nextRegistered = null;
+        }
+
+        // add MBean to set of managed beans
+        if (nextRegistered != null)
+            managedBeans.add(nextRegistered.getObjectName());
+        nextRegistered = null;
+    }
+
+    /**
+     * Registers MBeans for the Sigar types LoadAverage... 
+     */
+    private void registerSystemBeans() {
+
+        ObjectInstance nextRegistered = null;
+
+        // add load average bean
+        SigarLoadAverage loadAvg = new SigarLoadAverage(sigarImpl);
+
+        try {
+            if (!mbeanServer.isRegistered(new ObjectName(loadAvg
+                    .getObjectName())))
+                nextRegistered = mbeanServer.registerMBean(loadAvg, null);
+        } catch (Exception e) { // ignore
+        }
+
+        // add MBean to set of managed beans
+        if (nextRegistered != null)
+            managedBeans.add(nextRegistered.getObjectName());
+        nextRegistered = null;
+    }
+
+    /**
+     * Deregisters all Sigar MBeans that were created and registered using this 
+     * instance. After doing so, a super call is made to satisfy {@link AbstractMBean}.
+     * @throws Exception 
+     * 
+     * @see AbstractMBean#preDeregister()
+     */
+    public void preDeregister() throws Exception {
+
+        // count backwards to remove ONs immediately
+        for (int i = managedBeans.size() - 1; i >= 0; i--) {
+            ObjectName next = (ObjectName) managedBeans.remove(i);
+            if (mbeanServer.isRegistered(next)) {
+                try {
+                    mbeanServer.unregisterMBean(next);
+                } catch (Exception e) { // ignore
+                }
+            }
+        }
+
+        // do the super call
+        super.preDeregister();
+    }
 }
diff --git a/bindings/java/src/org/hyperic/sigar/jmx/SigarSwap.java b/bindings/java/src/org/hyperic/sigar/jmx/SigarSwap.java
index 8ce05816..c209d32f 100644
--- a/bindings/java/src/org/hyperic/sigar/jmx/SigarSwap.java
+++ b/bindings/java/src/org/hyperic/sigar/jmx/SigarSwap.java
@@ -35,174 +35,165 @@ import org.hyperic.sigar.SigarException;
  * package. Provides an OpenMBean conform implementation.
  * 
  * @author Bjoern Martin
- * @since 1.4 (2007-04)
+ * @since 1.5
  */
 public class SigarSwap extends AbstractMBean {
 
-	private static final String MBEAN_TYPE = "Swap";
+    private static final String MBEAN_TYPE = "Swap";
 
-	private static final MBeanInfo MBEAN_INFO;
-	
-	private static final MBeanAttributeInfo MBEAN_ATTR_FREE;
+    private static final MBeanInfo MBEAN_INFO;
 
-	private static final MBeanAttributeInfo MBEAN_ATTR_TOTAL;
+    private static final MBeanAttributeInfo MBEAN_ATTR_FREE;
 
-	private static final MBeanAttributeInfo MBEAN_ATTR_USED;
+    private static final MBeanAttributeInfo MBEAN_ATTR_TOTAL;
 
-	private static final MBeanConstructorInfo MBEAN_CONSTR_SIGAR;
+    private static final MBeanAttributeInfo MBEAN_ATTR_USED;
 
-	private static MBeanParameterInfo MBEAN_PARAM_SIGAR;
-	
-	static {
-		MBEAN_ATTR_FREE = new MBeanAttributeInfo(
-				"Free", "long",
-				"The amount of free swap memory, in [bytes]",
-				true, false, false);
-		MBEAN_ATTR_TOTAL = new MBeanAttributeInfo(
-				"Total", "long",
-				"The total amount of swap memory, in [bytes]",
-				true, false, false);
-		MBEAN_ATTR_USED = new MBeanAttributeInfo(
-				"Used", "long",
-				"The amount of swap memory in use, in [bytes]",
-				true, false, false);
-		MBEAN_PARAM_SIGAR = new MBeanParameterInfo(
-				"sigar", Sigar.class.getName(),
-				"The Sigar instance to use to fetch data from");
-		MBEAN_CONSTR_SIGAR = new MBeanConstructorInfo(
-				SigarSwap.class.getName(),
-				"Creates a new instance, using the Sigar instance " +
-				"specified to fetch the data.",
-				new MBeanParameterInfo[]{
-						MBEAN_PARAM_SIGAR});
-		MBEAN_INFO = new MBeanInfo(
-				SigarSwap.class.getName(),
-				"Sigar Swap MBean, provides raw data for the swap memory " +
-				"configured on the system. Uses an internal cache that " +
-				"invalidates within 5 seconds.",
-				new MBeanAttributeInfo[]{
-					MBEAN_ATTR_FREE, 
-					MBEAN_ATTR_TOTAL, 
-					MBEAN_ATTR_USED}, 
-				new MBeanConstructorInfo[]{
-					MBEAN_CONSTR_SIGAR},
-					null, null);
-		
-	}
-	
-	/**
-	 * Object name this instance will give itself when being registered to an
-	 * MBeanServer.
-	 */
-	private final String objectName;
+    private static final MBeanConstructorInfo MBEAN_CONSTR_SIGAR;
 
-	/**
-	 * Creates a new instance, using the Sigar instance specified to fetch the
-	 * data.
-	 * 
-	 * @param sigar
-	 *            The Sigar instance to use to fetch data from
-	 * 
-	 * @throws IllegalArgumentException
-	 *             If an unexpected Sigar error occurs
-	 */
-	public SigarSwap(Sigar sigar) throws IllegalArgumentException {
-		super(sigar, CACHED_5SEC);
+    private static MBeanParameterInfo MBEAN_PARAM_SIGAR;
 
-		this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" + MBEAN_ATTR_TYPE
-				+ "=Swap";
-	}
+    static {
+        MBEAN_ATTR_FREE = new MBeanAttributeInfo("Free", "long",
+                "The amount of free swap memory, in [bytes]", true, false,
+                false);
+        MBEAN_ATTR_TOTAL = new MBeanAttributeInfo("Total", "long",
+                "The total amount of swap memory, in [bytes]", true, false,
+                false);
+        MBEAN_ATTR_USED = new MBeanAttributeInfo("Used", "long",
+                "The amount of swap memory in use, in [bytes]", true, false,
+                false);
+        MBEAN_PARAM_SIGAR = new MBeanParameterInfo("sigar", Sigar.class
+                .getName(), "The Sigar instance to use to fetch data from");
+        MBEAN_CONSTR_SIGAR = new MBeanConstructorInfo(
+                SigarSwap.class.getName(),
+                "Creates a new instance, using the Sigar instance "
+                        + "specified to fetch the data.",
+                new MBeanParameterInfo[] { MBEAN_PARAM_SIGAR });
+        MBEAN_INFO = new MBeanInfo(
+                SigarSwap.class.getName(),
+                "Sigar Swap MBean, provides raw data for the swap memory "
+                        + "configured on the system. Uses an internal cache that "
+                        + "invalidates within 5 seconds.",
+                new MBeanAttributeInfo[] { MBEAN_ATTR_FREE, MBEAN_ATTR_TOTAL,
+                        MBEAN_ATTR_USED },
+                new MBeanConstructorInfo[] { MBEAN_CONSTR_SIGAR }, null, null);
 
-	/**
-	 * Object name this instance will give itself when being registered to an
-	 * MBeanServer.
-	 */
-	public String getObjectName() {
-		return this.objectName;
-	}
+    }
 
-	/**
-	 * @return The amount of free swap memory, in [bytes]
-	 */
-	public long getFree() {
-		try {
-			return sigar.getSwap().getFree();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+    /**
+     * Object name this instance will give itself when being registered to an
+     * MBeanServer.
+     */
+    private final String objectName;
 
-	/**
-	 * @return The total amount of swap memory, in [bytes]
-	 */
-	public long getTotal() {
-		try {
-			return sigar.getSwap().getTotal();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+    /**
+     * Creates a new instance, using the Sigar instance specified to fetch the
+     * data.
+     * 
+     * @param sigar
+     *            The Sigar instance to use to fetch data from
+     * 
+     * @throws IllegalArgumentException
+     *             If an unexpected Sigar error occurs
+     */
+    public SigarSwap(Sigar sigar) throws IllegalArgumentException {
+        super(sigar, CACHED_5SEC);
 
-	/**
-	 * @return The amount of swap memory in use, in [bytes]
-	 */
-	public long getUsed() {
-		try {
-			return sigar.getSwap().getUsed();
-		} catch (SigarException e) {
-			throw unexpectedError(MBEAN_TYPE, e);
-		}
-	}
+        this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" + MBEAN_ATTR_TYPE
+                + "=Swap";
+    }
 
-	// -------
-	// Implementation of the DynamicMBean interface
-	// -------
+    /**
+     * Object name this instance will give itself when being registered to an
+     * MBeanServer.
+     */
+    public String getObjectName() {
+        return this.objectName;
+    }
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see javax.management.DynamicMBean#getAttribute(java.lang.String)
-	 */
-	public Object getAttribute(String attr) throws AttributeNotFoundException,
-			MBeanException, ReflectionException {
-		if (MBEAN_ATTR_FREE.getName().equals(attr)) {
-			return new Long(getFree());
+    /**
+     * @return The amount of free swap memory, in [bytes]
+     */
+    public long getFree() {
+        try {
+            return sigar.getSwap().getFree();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
 
-		} else if (MBEAN_ATTR_TOTAL.getName().equals(attr)) {
-			return new Long(getTotal());
+    /**
+     * @return The total amount of swap memory, in [bytes]
+     */
+    public long getTotal() {
+        try {
+            return sigar.getSwap().getTotal();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
 
-		} else if (MBEAN_ATTR_USED.getName().equals(attr)) {
-			return new Long(getUsed());
+    /**
+     * @return The amount of swap memory in use, in [bytes]
+     */
+    public long getUsed() {
+        try {
+            return sigar.getSwap().getUsed();
+        } catch (SigarException e) {
+            throw unexpectedError(MBEAN_TYPE, e);
+        }
+    }
 
-		} else {
-			throw new AttributeNotFoundException(attr);
-		}
-	}
+    // -------
+    // Implementation of the DynamicMBean interface
+    // -------
 
-	/*
-	 * (non-Javadoc)
-	 * @see javax.management.DynamicMBean#setAttribute(javax.management.Attribute)
-	 */
-	public void setAttribute(Attribute attr) throws AttributeNotFoundException {
-		throw new AttributeNotFoundException(attr.getName());
-	}
+    /*
+     * (non-Javadoc)
+     * 
+     * @see javax.management.DynamicMBean#getAttribute(java.lang.String)
+     */
+    public Object getAttribute(String attr) throws AttributeNotFoundException,
+            MBeanException, ReflectionException {
+        if (MBEAN_ATTR_FREE.getName().equals(attr)) {
+            return new Long(getFree());
 
-	/*
-	 * (non-Javadoc)
-	 * @see javax.management.DynamicMBean#invoke(java.lang.String,
-	 *      java.lang.Object[], java.lang.String[])
-	 */
-	public Object invoke(String actionName, Object[] params, String[] signature)
-			throws ReflectionException {
-		throw new ReflectionException(new NoSuchMethodException(actionName),
-				actionName);
-	}
+        } else if (MBEAN_ATTR_TOTAL.getName().equals(attr)) {
+            return new Long(getTotal());
 
-	/*
-	 * (non-Javadoc)
-	 * @see javax.management.DynamicMBean#getMBeanInfo()
-	 */
-	public MBeanInfo getMBeanInfo() {
-		return MBEAN_INFO;
-	}
+        } else if (MBEAN_ATTR_USED.getName().equals(attr)) {
+            return new Long(getUsed());
+
+        } else {
+            throw new AttributeNotFoundException(attr);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see javax.management.DynamicMBean#setAttribute(javax.management.Attribute)
+     */
+    public void setAttribute(Attribute attr) throws AttributeNotFoundException {
+        throw new AttributeNotFoundException(attr.getName());
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see javax.management.DynamicMBean#invoke(java.lang.String,
+     *      java.lang.Object[], java.lang.String[])
+     */
+    public Object invoke(String actionName, Object[] params, String[] signature)
+            throws ReflectionException {
+        throw new ReflectionException(new NoSuchMethodException(actionName),
+                actionName);
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see javax.management.DynamicMBean#getMBeanInfo()
+     */
+    public MBeanInfo getMBeanInfo() {
+        return MBEAN_INFO;
+    }
 }