diff --git a/core/java/src/freenet/support/CPUInformation/CPUID.java b/core/java/src/freenet/support/CPUInformation/CPUID.java
index 04b2e2a47f676e46da9bd5823f9be8fb55d07f73..8e9811de3fa464b796fd89ef13f421e76ca8dfca 100644
--- a/core/java/src/freenet/support/CPUInformation/CPUID.java
+++ b/core/java/src/freenet/support/CPUInformation/CPUID.java
@@ -1,7 +1,6 @@
 /*
  * Created on Jul 14, 2004
- * Updated on Jun 8, 2011
- * 
+ * Updated on Jan 8, 2011
  */
 package freenet.support.CPUInformation;
 
@@ -71,12 +70,9 @@ public class CPUID {
     static
     {
         loadNative();
-    }
-    
-    /**
-     * A class that can (amongst other things I assume) represent the state of the
-     * different CPU registers after a call to the CPUID assembly method
-     */
+    }    
+    //A class that can (amongst other things I assume) represent the state of the
+    //different CPU registers after a call to the CPUID assembly method
     protected static class CPUIDResult {
         final int EAX;
         final int EBX;
@@ -170,14 +166,12 @@ public class CPUID {
         return c.ECX;
     }
     
-    /**
-     * Returns a CPUInfo item for the current type of CPU
-     * If I could I would declare this method in a interface named
-     * CPUInfoProvider and implement that interface in this class.
-     * This would make it easier for other people to understand that there
-     * is nothing preventing them from coding up new providers, probably using
-     * other detection methods than the x86-only CPUID instruction
-     */
+    //Returns a CPUInfo item for the current type of CPU
+    //If I could I would declare this method in a interface named
+    //CPUInfoProvider and implement that interface in this class.
+    //This would make it easier for other people to understand that there
+    //is nothing preventing them from coding up new providers, probably using
+    //other detection methods than the x86-only CPUID instruction
     public static CPUInfo getInfo() throws UnknownCPUException
     {
         if(!_nativeOk)
@@ -222,38 +216,53 @@ public class CPUID {
         }
         public boolean IsC3Compatible() { return false; }
     }
+
     protected static class VIAC3Impl extends CPUIDCPUInfo implements CPUInfo {
         @Override
         public boolean IsC3Compatible() { return true; }
         public String getCPUModelString() { return "VIA C3"; }
     }
+
     protected static class AMDInfoImpl extends CPUIDCPUInfo implements AMDCPUInfo
     {
-        public boolean IsK6Compatible()
-        {
-            return getCPUFamily() >= 5 && getCPUModel() >= 6;
+	//AMD-family = getCPUFamily()+getCPUExtendedFamily()
+	//AMD-model = getCPUModel()+getCPUExtendedModel()
+        public boolean IsK6Compatible(){
+            return (getCPUFamily() + getCPUExtendedFamily()) >= 5 && (getCPUModel() + getCPUExtendedModel()) >= 6;
         }
-        public boolean IsK6_2_Compatible()
-        {
-            return getCPUFamily() >= 5 && getCPUModel() >= 8;
+		
+        public boolean IsK6_2_Compatible(){
+            return (getCPUFamily() + getCPUExtendedFamily()) >= 5 && (getCPUModel() + getCPUExtendedModel()) >= 8;
         }
-        public boolean IsK6_3_Compatible()
-        {
-            return getCPUFamily() >= 5 && getCPUModel() >= 9;
+		
+        public boolean IsK6_3_Compatible(){
+            return (getCPUFamily() + getCPUExtendedFamily()) >= 5 && (getCPUModel() + getCPUExtendedModel()) >= 9;
         }
-        public boolean IsAthlonCompatible()
-        {
-            return getCPUFamily() >= 6;
+		
+        public boolean IsAthlonCompatible(){
+            return (getCPUFamily() + getCPUExtendedFamily()) >= 6;
         }
-        public boolean IsAthlon64Compatible()
-        {
-            return getCPUFamily() == 15 && getCPUExtendedFamily() == 0;
+		
+        public boolean IsAthlon64Compatible(){	
+			//AMD64 class
+			if ((getCPUFamily() + getCPUExtendedFamily()) == 15){
+				return true;
+			//Stars (Phenom II/Athlon II/Third-Generation Opteron/Opteron 4100 & 6100/Sempron 1xx) 
+			} else if ((getCPUFamily() + getCPUExtendedFamily()) == 16){
+				return true;
+			//K8 mobile+HT3 (Turion X2/Athlon X2/Sempron)
+			} else if ((getCPUFamily() + getCPUExtendedFamily()) == 17){
+				return true;
+			} else {
+				return false;
+			}
         }
 
-        public String getCPUModelString() throws UnknownCPUException
-        {
-            if(getCPUFamily() == 4){
-                switch(getCPUModel()){
+        public String getCPUModelString() throws UnknownCPUException {
+
+		//i486 class (Am486, 5x86) 
+            if(getCPUFamily() + getCPUExtendedFamily() == 4){
+                switch(getCPUModel() + getCPUExtendedModel()){
                     case 3:
                         return "486 DX/2";
                     case 7:
@@ -268,8 +277,9 @@ public class CPUID {
                         return "Am5x86-WB";
                 }
             }
-            if(getCPUFamily() == 5){
-                switch(getCPUModel()){
+			//i586 class (K5/K6/K6-2/K6-III) 
+            if(getCPUFamily() + getCPUExtendedFamily() == 5){
+                switch(getCPUModel() + getCPUExtendedModel()){
                     case 0:
                         return "K5/SSA5";
                     case 1:
@@ -290,8 +300,9 @@ public class CPUID {
                         return "K6-2+ or K6-III+";
                 }
             }
-            if(getCPUFamily() == 6){
-                switch(getCPUModel()){
+			//i686 class (Athlon/Athlon XP/Duron/K7 Sempron) 
+            if(getCPUFamily() + getCPUExtendedFamily() == 6){
+                switch(getCPUModel() + getCPUExtendedModel()){
                     case 0:
                         return "Athlon (250 nm)";
                     case 1:
@@ -310,24 +321,125 @@ public class CPUID {
                         return "Athlon (Thoroughbred)";
                     case 10:
                         return "Athlon (Barton)";
+				}
+            }
+			//AMD64 class (A64/Opteron/A64 X2/K8 Sempron/Turion/Second-Generation Opteron/Athlon Neo) 
+		   if(getCPUFamily() + getCPUExtendedFamily() == 15){
+				switch(getCPUModel() + getCPUExtendedModel()){
+					case 4:
+						return "Athlon 64/Mobile XP-M";
+					case 5:
+						return "Athlon 64 FX Opteron";
+					case 7:
+						return "Athlon 64 FX (Sledgehammer S939, 130 nm)";
+					case 8:
+						return "Mobile A64/Sempron/XP-M";
+					case 11:
+						return "Athlon 64 (Clawhammer S939, 130 nm)";
+					case 12:
+						return "Athlon 64/Sempron (Newcastle S754, 130 nm)";
+					case 14:
+						return "Athlon 64/Sempron (Newcastle S754, 130 nm)";
+					case 15:
+						return "Athlon 64/Sempron (Clawhammer S939, 130 nm)";					
+					case 18:
+						return "Sempron (Palermo, 90 nm)";
+					case 20:
+						return "Athlon 64 (Winchester S754, 90 nm)";
+					case 23:
+						return "Athlon 64 (Winchester S939, 90 nm)";
+					case 24:
+						return "Mobile A64/Sempron/XP-M (Winchester S754, 90 nm)";
+					case 26:
+						return "Athlon 64 (Winchester S939, 90 nm)";
+					case 27:
+						return "Athlon 64/Sempron (Winchester/Palermo 90 nm)";
+					case 28:
+						return "Sempron (Palermo, 90 nm)";
+					case 31:
+						return "Athlon 64/Sempron (Winchester/Palermo, 90 nm)";
+					case 33:
+						return "Dual-Core Opteron (Italy-Egypt S940, 90 nm)";
+					case 35:
+						return "Athlon 64 X2/A64 FX/Opteron (Toledo/Denmark S939, 90 nm)";
+					case 36:
+						return "Mobile A64/Turion (Lancaster/Richmond/Newark, 90 nm)";
+					case 37:
+						return "Opteron (Troy/Athens S940, 90 nm)";
+					case 39:
+						return "Athlon 64 (San Diego, 90 nm)";
+					case 43:
+						return "Athlon 64 X2 (Manchester, 90 nm)";
+					case 44:
+						return "Sempron/mobile Sempron (Palermo/Albany/Roma S754, 90 nm)";
+					case 47:
+						return "Athlon 64/Sempron (Venice/Palermo S939, 90 nm)";
+					case 65:
+						return "Second-Generaton Opteron (Santa Rosa S1207, 90 nm)";
+					case 67:
+						return "Athlon 64 X2/2nd-gen Opteron (Windsor/Santa Rosa, 90 nm)";
+					case 72:
+						return "Athlon 64 X2/Turion 64 X2 (Windsor/Taylor/Trinidad, 90 nm)";
+					case 75:
+						return "Athlon 64 X2 (Windsor, 90 nm)";
+					case 76:
+						return "Mobile A64/mobile Sempron/Turion (Keene/Trinidad/Taylor, 90 nm)";
+					case 79:
+						return "Athlon 64/Sempron (Orleans/Manila AM2, 90 nm)";
+					case 93:
+						return "Opteron Gen 2 (Santa Rosa, 90 nm)";
+					case 95:
+						return "A64/Sempron/mobile Sempron (Orleans/Manila/Keene, 90 nm)";
+					case 104:
+						return "Turion 64 X2 (Tyler S1, 65 nm)";
+					case 107:
+						return "Athlon 64 X2/Sempron X2/Athlon Neo X2 (Brisbane/Huron, 65 nm)";
+					case 108:
+						return "A64/Athlon Neo/Sempron/Mobile Sempron (Lima/Huron/Sparta/Sherman, 65 nm)";
+					case 111:
+						return "Neo/Sempron/mobile Sempron (Huron/Sparta/Sherman, 65 nm)";
+					case 124:
+						return "Athlon/Sempron/mobile Sempron (Lima/Sparta/Sherman, 65 nm)";
+					case 127:
+						return "A64/Athlon Neo/Sempron/mobile Sempron (Lima/Huron/Sparta/Sherman, 65 nm)";
+					case 193:
+						return "Athlon 64 FX (Windsor S1207 90 nm)";
+					default: // is this safe?
+						return "Athlon 64 (unknown)";
+				}
+            }
+			//Stars (Phenom II/Athlon II/Third-Generation Opteron/Opteron 4100 & 6100/Sempron 1xx) 
+            if(getCPUFamily() + getCPUExtendedFamily() == 16){
+                switch(getCPUModel() + getCPUExtendedModel()){
+                    case 2:
+                        return "Phenom / Athlon / Opteron Gen 3 (Barcelona/Agena/Toliman/Kuma, 65 nm)";
+                    case 4:
+                        return "Phenom II / Opteron Gen 3 (Shanghai/Deneb/Heka/Callisto, 45 nm)";
+                    case 5:
+                        return "Athlon II X2/X3/X4 (Regor/Rana/Propus AM3, 45 nm)";
+                    case 6:
+                        return "Mobile Athlon II/Turion II/Phenom II/Sempron/V-series (Regor/Caspian/Champlain, 45 nm)";
+                    case 8:
+                        return "Six-Core Opteron/Opteron 4100 series (Istanbul/Lisbon, 45 nm)";
+                    case 9:
+                        return "Opteron 6100 series (Magny-Cours G34, 45 nm)";
+                    case 10:
+                        return "Phenom II X4/X6 (Zosma/Thuban AM3, 45 nm)";
                 }
             }
-            if(getCPUFamily() == 15){
-                if(getCPUExtendedFamily() == 0){
-                    switch(getCPUModel()){
-                        case 4:
-                            return "Athlon 64";
-                        case 5:
-                            return "Athlon 64 FX Opteron";
-                        case 12:
-                            return "Athlon 64";
-                        default: // is this safe?
-                            return "Athlon 64 (unknown)";
-                    }
+			//K8 mobile+HT3 (Turion X2/Athlon X2/Sempron) 
+            if(getCPUFamily() + getCPUExtendedFamily() == 17){
+                switch(getCPUModel() + getCPUExtendedModel()){
+                    case 3:
+                        return "AMD Turion X2/Athlon X2/Sempron (Lion/Sable, 65 nm)";
                 }
             }
-            throw new UnknownCPUException("Unknown AMD CPU; Family="+getCPUFamily()+", Model="+getCPUModel());
-        }
+			//Bobcat
+            if(getCPUFamily() + getCPUExtendedFamily() == 20){
+				//No known CPUIDs yet.
+            }
+            throw new UnknownCPUException("Unknown AMD CPU; Family="+(getCPUFamily() + getCPUExtendedFamily())+", Model="+(getCPUModel() + getCPUExtendedModel()));
+		}
     }
 
     protected static class IntelInfoImpl extends CPUIDCPUInfo implements IntelCPUInfo
@@ -345,26 +457,18 @@ public class CPUID {
             return getCPUFamily() > 6 || (getCPUFamily() == 6 && getCPUModel() >=3);
         }
         public boolean IsPentium3Compatible()
-        {	
-		// Atom
-		if (getCPUExtendedModel() == 1 && (getCPUFamily() == 6 && (getCPUModel() == 12))){
-			return true;
-		// ??
-		} else if (getCPUExtendedModel() == 0 && (getCPUFamily() > 6 || (getCPUFamily() == 6 && getCPUModel() >=7))){
-			return true;
-		} else {
-			return false;
-		}
+        {
+            return getCPUFamily() > 6 || (getCPUFamily() == 6 && getCPUModel() >=7);
         }
         public boolean IsPentium4Compatible()
         {	
-		// P4
+			// P4
         	if (getCPUFamily() >= 15){
         		return true;
-		// Xeon MP (45nm) or Core i7
+			// Xeon MP (45nm) or Core i7
         	} else if (getCPUExtendedModel() == 1 && (getCPUFamily() == 6 && (getCPUModel() == 10 || getCPUModel() == 13))){
         		return true;
-		// Core 2 Duo
+			// Core 2 Duo
         	} else if (getCPUExtendedModel() == 0 && getCPUFamily() == 6 && getCPUModel() == 15){
         		return true;
         	} else {
@@ -445,35 +549,33 @@ public class CPUID {
 	                        return "Mobile Core (Yonah)";
 	                    case 15:
 	                        return "Core 2 (Conroe)";
-	                }
-            	} else {
-		    	if (getCPUExtendedModel() == 1){
-		    		 switch(getCPUModel()){
+					}
+            	} else if (getCPUExtendedModel() == 1){
+					switch(getCPUModel()){
 		    		 	case 10:
 		    		 		return "Core i7 (45nm)";
 		    		 	case 12:
 		    		 		return "Atom";
 		    		 	case 13:
 		    		 		return "Xeon MP (45nm)";
-					case 14:
-						return "Core i5/i7 (45nm)";
-		    		 }
+						case 14:
+							return "Core i5/i7 (45nm)";
+		    		}
 		    	} else if (getCPUExtendedModel() == 2){
-				switch(getCPUModel()){
-					case 5:
-						return "Core i3 or i5/i7 mobile (32nm)";
-					case 10:
-						return "Core i7 (32nm)";
-					case 12:
-						return "Core i7 (32nm)";
-					case 14:
-						return "Xeon MP (45nm)";
-					case 15:
-						return "Xeon MP (32nm)";
+					switch(getCPUModel()){
+						case 5:
+							return "Core i3 or i5/i7 mobile (32nm)";
+						case 10:
+							return "Core i7/i5 (32nm)";
+						case 12:
+							return "Core i7 (32nm)";
+						case 14:
+							return "Xeon MP (45nm)";
+						case 15:
+							return "Xeon MP (32nm)";
+					}				
 				}
 			}
-		}
-            }
             if(getCPUFamily() == 7){
                 switch(getCPUModel()){
                     //Itanium.. TODO
@@ -517,7 +619,7 @@ public class CPUID {
         System.out.println("CPU Family: " + getCPUFamily());
         System.out.println("CPU Model: " + getCPUModel());
         System.out.println("CPU Stepping: " + getCPUStepping());
-        System.out.println("CPU Flags: 0x" + Integer.toHexString(getEDXCPUFlags()));
+        System.out.println("CPU Flags: " + getEDXCPUFlags());
         
         CPUInfo c = getInfo();
         System.out.println(" **More CPUInfo**");
@@ -749,8 +851,8 @@ public class CPUID {
              return "jcpuid-x86_64-windows";
         if(isFreebsd)
             return "jcpuid-x86_64-freebsd";
-	if(isSunos)
-	    return "jcpuid-x86_64-solaris";
+		if(isSunos)
+	    	return "jcpuid-x86_64-solaris";
         // use linux as the default, don't throw exception
         return "jcpuid-x86_64-linux";
     }