diff --git a/sonar/examples/pom.xml b/sonar/examples/pom.xml
index 0c16a89..f67fc81 100644
--- a/sonar/examples/pom.xml
+++ b/sonar/examples/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-parent</artifactId>
-        <version>4.1.1-SNAPSHOT</version>
+        <version>4.1.2-SNAPSHOT</version>
     </parent>
     <artifactId>poi-examples</artifactId>
     <packaging>jar</packaging>
diff --git a/sonar/excelant/pom.xml b/sonar/excelant/pom.xml
index 6008b44..3993a12 100644
--- a/sonar/excelant/pom.xml
+++ b/sonar/excelant/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-parent</artifactId>
-        <version>4.1.1-SNAPSHOT</version>
+        <version>4.1.2-SNAPSHOT</version>
     </parent>
     <artifactId>poi-excelant</artifactId>
     <packaging>jar</packaging>
diff --git a/sonar/main/pom.xml b/sonar/main/pom.xml
index 464149b..23c9b96 100644
--- a/sonar/main/pom.xml
+++ b/sonar/main/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-parent</artifactId>
-        <version>4.1.1-SNAPSHOT</version>
+        <version>4.1.2-SNAPSHOT</version>
     </parent>
     <artifactId>poi-main</artifactId>
     <packaging>jar</packaging>
diff --git a/sonar/ooxml-schema-encryption/pom.xml b/sonar/ooxml-schema-encryption/pom.xml
index f18ec33..3db0f22 100644
--- a/sonar/ooxml-schema-encryption/pom.xml
+++ b/sonar/ooxml-schema-encryption/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-parent</artifactId>
-        <version>4.1.1-SNAPSHOT</version>
+        <version>4.1.2-SNAPSHOT</version>
         <relativePath>..</relativePath>
     </parent>
     <artifactId>poi-ooxml-schema-encryption</artifactId>
diff --git a/sonar/ooxml-schema-security/pom.xml b/sonar/ooxml-schema-security/pom.xml
index 8735be7..58e355a 100644
--- a/sonar/ooxml-schema-security/pom.xml
+++ b/sonar/ooxml-schema-security/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-parent</artifactId>
-        <version>4.1.1-SNAPSHOT</version>
+        <version>4.1.2-SNAPSHOT</version>
         <relativePath>..</relativePath>
     </parent>
     <artifactId>poi-ooxml-schema-security</artifactId>
diff --git a/sonar/ooxml-schema/pom.xml b/sonar/ooxml-schema/pom.xml
index eaabe65..2963e13 100644
--- a/sonar/ooxml-schema/pom.xml
+++ b/sonar/ooxml-schema/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-parent</artifactId>
-        <version>4.1.1-SNAPSHOT</version>
+        <version>4.1.2-SNAPSHOT</version>
         <relativePath>..</relativePath>
     </parent>
     <artifactId>poi-ooxml-schema</artifactId>
diff --git a/sonar/ooxml/pom.xml b/sonar/ooxml/pom.xml
index c778f43..332c6e4 100644
--- a/sonar/ooxml/pom.xml
+++ b/sonar/ooxml/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-parent</artifactId>
-        <version>4.1.1-SNAPSHOT</version>
+        <version>4.1.2-SNAPSHOT</version>
     </parent>
     <artifactId>poi-ooxml</artifactId>
     <packaging>jar</packaging>
diff --git a/sonar/pom.xml b/sonar/pom.xml
index ed6dbd9..91e5062 100644
--- a/sonar/pom.xml
+++ b/sonar/pom.xml
@@ -4,7 +4,7 @@
     <groupId>org.apache.poi</groupId>
     <artifactId>poi-parent</artifactId>
     <packaging>pom</packaging>
-    <version>4.1.1-SNAPSHOT</version>
+    <version>4.1.2-SNAPSHOT</version>
     <name>Apache POI - the Java API for Microsoft Documents</name>
     <description>Maven build of Apache POI for Sonar checks</description>
     <url>http://poi.apache.org/</url>
diff --git a/sonar/scratchpad/pom.xml b/sonar/scratchpad/pom.xml
index 6cd27ab..dc94d9e 100644
--- a/sonar/scratchpad/pom.xml
+++ b/sonar/scratchpad/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-parent</artifactId>
-        <version>4.1.1-SNAPSHOT</version>
+        <version>4.1.2-SNAPSHOT</version>
     </parent>
     <artifactId>poi-scratchpad</artifactId>
     <packaging>jar</packaging>
diff --git a/src/java/org/apache/poi/ss/usermodel/FractionFormat.java b/src/java/org/apache/poi/ss/usermodel/FractionFormat.java
index d90d500..3d95698 100644
--- a/src/java/org/apache/poi/ss/usermodel/FractionFormat.java
+++ b/src/java/org/apache/poi/ss/usermodel/FractionFormat.java
@@ -16,6 +16,8 @@
  */
 
 package org.apache.poi.ss.usermodel;
+
+import java.math.BigDecimal;
 import java.text.FieldPosition;
 import java.text.Format;
 import java.text.ParsePosition;
@@ -99,14 +101,15 @@
 
     public String format(Number num) {
 
-        final double doubleValue = num.doubleValue();
+        final BigDecimal doubleValue = new BigDecimal(num.doubleValue());
         
-        final boolean isNeg = (doubleValue < 0.0f) ? true : false;
-        final double absDoubleValue = Math.abs(doubleValue);
-        
-        final double wholePart = Math.floor(absDoubleValue);
-        final double decPart = absDoubleValue - wholePart;
-        if (wholePart + decPart == 0) {
+        final boolean isNeg = doubleValue.compareTo(BigDecimal.ZERO) < 0;
+
+        final BigDecimal absValue = doubleValue.abs();
+        final BigDecimal wholePart = new BigDecimal(absValue.toBigInteger());
+        final BigDecimal decPart = absValue.remainder(BigDecimal.ONE);
+
+        if (wholePart.add(decPart).compareTo(BigDecimal.ZERO) == 0) {
             return "0";
         }
         
@@ -119,13 +122,13 @@
         // }
         
         //this is necessary to prevent overflow in the maxDenom calculation
-        if (Double.compare(decPart, 0) == 0){
+        if (decPart.compareTo(BigDecimal.ZERO) == 0){
             
             StringBuilder sb = new StringBuilder();
             if (isNeg){
                 sb.append("-");
             }
-            sb.append((int)wholePart);
+            sb.append(wholePart);
             return sb.toString();
         }
         
@@ -133,13 +136,13 @@
         try{
             //this should be the case because of the constructor
             if (exactDenom > 0){
-                fract = SimpleFraction.buildFractionExactDenominator(decPart, exactDenom);
+                fract = SimpleFraction.buildFractionExactDenominator(decPart.doubleValue(), exactDenom);
             } else {
-                fract = SimpleFraction.buildFractionMaxDenominator(decPart, maxDenom);
+                fract = SimpleFraction.buildFractionMaxDenominator(decPart.doubleValue(), maxDenom);
             }
         } catch (RuntimeException e){
             LOGGER.log(POILogger.WARN, "Can't format fraction", e);
-            return Double.toString(doubleValue);
+            return Double.toString(doubleValue.doubleValue());
         }
 
         StringBuilder sb = new StringBuilder();
@@ -151,23 +154,25 @@
         
         //if whole part has to go into the numerator
         if (wholePartFormatString == null || wholePartFormatString.isEmpty()){
-            int trueNum = (fract.getDenominator()*(int)wholePart)+fract.getNumerator();
-            sb.append(trueNum).append("/").append(fract.getDenominator());
+            final int fden = fract.getDenominator();
+            final int fnum = fract.getNumerator();
+            BigDecimal trueNum = wholePart.multiply(new BigDecimal(fden)).add(new BigDecimal(fnum));
+            sb.append(trueNum.toBigInteger()).append("/").append(fden);
             return sb.toString();
         }
         
         
         //short circuit if fraction is 0 or 1
         if (fract.getNumerator() == 0){
-            sb.append(Integer.toString((int)wholePart));
+            sb.append(wholePart);
             return sb.toString();
         } else if (fract.getNumerator() == fract.getDenominator()){
-            sb.append(Integer.toString((int)wholePart+1));
+            sb.append(wholePart.add(BigDecimal.ONE));
             return sb.toString();
         }
        //as mentioned above, this ignores the exact space formatting in Excel
-        if (wholePart > 0){
-            sb.append(Integer.toString((int)wholePart)).append(" ");
+        if (wholePart.compareTo(BigDecimal.ZERO) > 0){
+            sb.append(wholePart).append(" ");
         }
         sb.append(fract.getNumerator()).append("/").append(fract.getDenominator());
         return sb.toString();
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java
index 824122b..dd7afa4 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java
@@ -337,7 +337,7 @@
         }
 
 
-        EscherPropertyTypes escherProp = ADJUST_VALUES[adjInt];
+        EscherPropertyTypes escherProp = ADJUST_VALUES[adjInt-1];
 
         int adjval = getEscherProperty(escherProp, -1);
 
diff --git a/src/testcases/org/apache/poi/hpsf/extractor/TestHPSFPropertiesExtractor.java b/src/testcases/org/apache/poi/hpsf/extractor/TestHPSFPropertiesExtractor.java
index aebe0fd..19f54bb 100644
--- a/src/testcases/org/apache/poi/hpsf/extractor/TestHPSFPropertiesExtractor.java
+++ b/src/testcases/org/apache/poi/hpsf/extractor/TestHPSFPropertiesExtractor.java
@@ -33,102 +33,102 @@
 import org.junit.Test;
 
 public final class TestHPSFPropertiesExtractor {
-	private static final POIDataSamples _samples = POIDataSamples.getHPSFInstance();
+    private static final POIDataSamples _samples = POIDataSamples.getHPSFInstance();
 
-	@Test
-	public void testNormalProperties() throws Exception {
-		try (InputStream is = _samples.openResourceAsStream("TestMickey.doc");
-			POIFSFileSystem fs = new POIFSFileSystem(is);
-			HPSFPropertiesExtractor ext = new HPSFPropertiesExtractor(fs)) {
-			// Check each bit in turn
-			String summary = ext.getSummaryInformationText();
-			String docSummary = ext.getDocumentSummaryInformationText();
+    @Test
+    public void testNormalProperties() throws Exception {
+        try (InputStream is = _samples.openResourceAsStream("TestMickey.doc");
+             POIFSFileSystem fs = new POIFSFileSystem(is);
+             HPSFPropertiesExtractor ext = new HPSFPropertiesExtractor(fs)) {
+            // Check each bit in turn
+            String summary = ext.getSummaryInformationText();
+            String docSummary = ext.getDocumentSummaryInformationText();
 
-			assertContains(summary, "TEMPLATE = Normal");
-			assertContains(summary, "SUBJECT = sample subject");
-			assertContains(docSummary, "MANAGER = sample manager");
-			assertContains(docSummary, "COMPANY = sample company");
+            assertContains(summary, "TEMPLATE = Normal");
+            assertContains(summary, "SUBJECT = sample subject");
+            assertContains(docSummary, "MANAGER = sample manager");
+            assertContains(docSummary, "COMPANY = sample company");
 
-			// Now overall
-			String text = ext.getText();
-			assertContains(text, "TEMPLATE = Normal");
-			assertContains(text, "SUBJECT = sample subject");
-			assertContains(text, "MANAGER = sample manager");
-			assertContains(text, "COMPANY = sample company");
-		}
-	}
+            // Now overall
+            String text = ext.getText();
+            assertContains(text, "TEMPLATE = Normal");
+            assertContains(text, "SUBJECT = sample subject");
+            assertContains(text, "MANAGER = sample manager");
+            assertContains(text, "COMPANY = sample company");
+        }
+    }
 
-	@Test
-	public void testNormalUnicodeProperties() throws Exception {
+    @Test
+    public void testNormalUnicodeProperties() throws Exception {
 
-		try (InputStream is = _samples.openResourceAsStream("TestUnicode.xls");
-		 	POIFSFileSystem fs = new POIFSFileSystem(is);
-			HPSFPropertiesExtractor ext = new HPSFPropertiesExtractor(fs)) {
-			// Check each bit in turn
-			String summary = ext.getSummaryInformationText();
-			String docSummary = ext.getDocumentSummaryInformationText();
+        try (InputStream is = _samples.openResourceAsStream("TestUnicode.xls");
+             POIFSFileSystem fs = new POIFSFileSystem(is);
+             HPSFPropertiesExtractor ext = new HPSFPropertiesExtractor(fs)) {
+            // Check each bit in turn
+            String summary = ext.getSummaryInformationText();
+            String docSummary = ext.getDocumentSummaryInformationText();
 
-			assertContains(summary, "AUTHOR = marshall");
-			assertContains(summary, "TITLE = Titel: \u00c4h");
-			assertContains(docSummary, "COMPANY = Schreiner");
-			assertContains(docSummary, "SCALE = false");
+            assertContains(summary, "AUTHOR = marshall");
+            assertContains(summary, "TITLE = Titel: \u00c4h");
+            assertContains(docSummary, "COMPANY = Schreiner");
+            assertContains(docSummary, "SCALE = false");
 
-			// Now overall
-			String text = ext.getText();
-			assertContains(text, "AUTHOR = marshall");
-			assertContains(text, "TITLE = Titel: \u00c4h");
-			assertContains(text, "COMPANY = Schreiner");
-			assertContains(text, "SCALE = false");
-		}
-	}
+            // Now overall
+            String text = ext.getText();
+            assertContains(text, "AUTHOR = marshall");
+            assertContains(text, "TITLE = Titel: \u00c4h");
+            assertContains(text, "COMPANY = Schreiner");
+            assertContains(text, "SCALE = false");
+        }
+    }
 
-	@Test
-	public void testCustomProperties() throws Exception {
-		try (InputStream is = _samples.openResourceAsStream("TestMickey.doc");
-			 POIFSFileSystem fs = new POIFSFileSystem(is);
-			 HPSFPropertiesExtractor ext = new HPSFPropertiesExtractor(fs)) {
+    @Test
+    public void testCustomProperties() throws Exception {
+        try (InputStream is = _samples.openResourceAsStream("TestMickey.doc");
+             POIFSFileSystem fs = new POIFSFileSystem(is);
+             HPSFPropertiesExtractor ext = new HPSFPropertiesExtractor(fs)) {
 
-			// Custom properties are part of the document info stream
-			String dinfText = ext.getDocumentSummaryInformationText();
-			assertContains(dinfText, "Client = sample client");
-			assertContains(dinfText, "Division = sample division");
+            // Custom properties are part of the document info stream
+            String dinfText = ext.getDocumentSummaryInformationText();
+            assertContains(dinfText, "Client = sample client");
+            assertContains(dinfText, "Division = sample division");
 
-			String text = ext.getText();
-			assertContains(text, "Client = sample client");
-			assertContains(text, "Division = sample division");
-		}
-	}
+            String text = ext.getText();
+            assertContains(text, "Client = sample client");
+            assertContains(text, "Division = sample division");
+        }
+    }
 
-	@Test
-	public void testConstructors() throws IOException {
-		POIFSFileSystem fs;
-		HSSFWorkbook wb;
-		try {
-			fs = new POIFSFileSystem(_samples.openResourceAsStream("TestUnicode.xls"));
-			wb = new HSSFWorkbook(fs);
-		} catch (IOException e) {
-			throw new RuntimeException(e);
-		}
-		ExcelExtractor excelExt = new ExcelExtractor(wb);
+    @Test
+    public void testConstructors() throws IOException {
+        POIFSFileSystem fs;
+        HSSFWorkbook wb;
+        try {
+            fs = new POIFSFileSystem(_samples.openResourceAsStream("TestUnicode.xls"));
+            wb = new HSSFWorkbook(fs);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        ExcelExtractor excelExt = new ExcelExtractor(wb);
 
-		final String fsText;
-		HPSFPropertiesExtractor fsExt = new HPSFPropertiesExtractor(fs);
-		fsExt.setFilesystem(null); // Don't close re-used test resources!
-		try {
-		    fsText = fsExt.getText();
-		} finally {
-		    fsExt.close();
-		}
-        
-        final String hwText; 
-		HPSFPropertiesExtractor hwExt = new HPSFPropertiesExtractor(wb);
-		hwExt.setFilesystem(null); // Don't close re-used test resources!
-		try {
-		    hwText = hwExt.getText();
-		} finally {
-		    hwExt.close();
-		}
-		
+        final String fsText;
+        HPSFPropertiesExtractor fsExt = new HPSFPropertiesExtractor(fs);
+        fsExt.setFilesystem(null); // Don't close re-used test resources!
+        try {
+            fsText = fsExt.getText();
+        } finally {
+            fsExt.close();
+        }
+
+        final String hwText;
+        HPSFPropertiesExtractor hwExt = new HPSFPropertiesExtractor(wb);
+        hwExt.setFilesystem(null); // Don't close re-used test resources!
+        try {
+            hwText = hwExt.getText();
+        } finally {
+            hwExt.close();
+        }
+
         final String eeText;
         HPSFPropertiesExtractor eeExt = new HPSFPropertiesExtractor(excelExt);
         eeExt.setFilesystem(null); // Don't close re-used test resources!
@@ -139,26 +139,26 @@
             wb.close();
         }
 
-		assertEquals(fsText, hwText);
-		assertEquals(fsText, eeText);
+        assertEquals(fsText, hwText);
+        assertEquals(fsText, eeText);
 
-		assertContains(fsText, "AUTHOR = marshall");
-		assertContains(fsText, "TITLE = Titel: \u00c4h");
-	}
+        assertContains(fsText, "AUTHOR = marshall");
+        assertContains(fsText, "TITLE = Titel: \u00c4h");
+    }
 
-	@Test
-	public void test42726() throws IOException {
-		try (HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("42726.xls");
-				HPSFPropertiesExtractor ext = new HPSFPropertiesExtractor(wb)) {
-			String txt = ext.getText();
-			assertContains(txt, "PID_AUTHOR");
-			assertContains(txt, "PID_EDITTIME");
-			assertContains(txt, "PID_REVNUMBER");
-			assertContains(txt, "PID_THUMBNAIL");
-		}
-	}
+    @Test
+    public void test42726() throws IOException {
+        try (HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("42726.xls");
+             HPSFPropertiesExtractor ext = new HPSFPropertiesExtractor(wb)) {
+            String txt = ext.getText();
+            assertContains(txt, "PID_AUTHOR");
+            assertContains(txt, "PID_EDITTIME");
+            assertContains(txt, "PID_REVNUMBER");
+            assertContains(txt, "PID_THUMBNAIL");
+        }
+    }
 
-	@Test
+    @Test
     public void testThumbnail() throws Exception {
         POIFSFileSystem fs = new POIFSFileSystem(_samples.openResourceAsStream("TestThumbnail.xls"));
         HSSFWorkbook wb = new HSSFWorkbook(fs);
@@ -169,25 +169,25 @@
         wb.close();
     }
 
-	@Test
+    @Test
     public void test52258() throws Exception {
-		try (InputStream is = _samples.openResourceAsStream("TestVisioWithCodepage.vsd");
-			 POIFSFileSystem fs = new POIFSFileSystem(is);
-			 HPSFPropertiesExtractor ext = new HPSFPropertiesExtractor(fs)) {
-			assertNotNull(ext.getDocSummaryInformation());
-			assertNotNull(ext.getDocumentSummaryInformationText());
-			assertNotNull(ext.getSummaryInformation());
-			assertNotNull(ext.getSummaryInformationText());
-			assertNotNull(ext.getText());
-		}
+        try (InputStream is = _samples.openResourceAsStream("TestVisioWithCodepage.vsd");
+             POIFSFileSystem fs = new POIFSFileSystem(is);
+             HPSFPropertiesExtractor ext = new HPSFPropertiesExtractor(fs)) {
+            assertNotNull(ext.getDocSummaryInformation());
+            assertNotNull(ext.getDocumentSummaryInformationText());
+            assertNotNull(ext.getSummaryInformation());
+            assertNotNull(ext.getSummaryInformationText());
+            assertNotNull(ext.getText());
+        }
     }
 
-	@Test
-	public void test61300Extractor() throws IOException {
-		try (POIFSFileSystem poifs = new POIFSFileSystem(
-				POIDataSamples.getPOIFSInstance().getFile("61300.bin"))) {
-			HPSFPropertiesExtractor ext = new HPSFPropertiesExtractor(poifs);
-			assertContains(ext.getText(), "PID_CODEPAGE = 1252");
-		}
-	}
+    @Test
+    public void test61300Extractor() throws IOException {
+        try (POIFSFileSystem poifs = new POIFSFileSystem(
+                POIDataSamples.getPOIFSInstance().getFile("61300.bin"))) {
+            HPSFPropertiesExtractor ext = new HPSFPropertiesExtractor(poifs);
+            assertContains(ext.getText(), "PID_CODEPAGE = 1252");
+        }
+    }
 }
diff --git a/src/testcases/org/apache/poi/ss/usermodel/TestFractionFormat.java b/src/testcases/org/apache/poi/ss/usermodel/TestFractionFormat.java
index e99c3fe..dd08f6d 100644
--- a/src/testcases/org/apache/poi/ss/usermodel/TestFractionFormat.java
+++ b/src/testcases/org/apache/poi/ss/usermodel/TestFractionFormat.java
@@ -41,6 +41,22 @@
         String ret = f.format(val);
         assertEquals("26027/81", ret);
     }
+    
+    @Test
+    public void testWithBigWholePart() throws Exception {
+        FractionFormat f = new FractionFormat("#", "???/???");
+        
+        assertEquals("10100136259702", f.format(10100136259702d));
+        assertEquals("-10100136259702", f.format(-10100136259702d));
+        
+        // Excel displays fraction: 51/512
+        assertEquals("10100136259702 10/100", f.format(10100136259702.1d));
+        assertEquals("-10100136259702 10/100", f.format(-10100136259702.1d));
+        
+        // Excel displays fraction: 461/512
+        assertEquals("10100136259702 90/100", f.format(10100136259702.9d));
+        assertEquals("-10100136259702 90/100", f.format(-10100136259702.9d));
+    }
      
     @Test
     public void testTruthFile() throws Exception {
