diff --git a/tests/src/org/apache/pivot/tests/issues/pivot929/Pivot929.java b/tests/src/org/apache/pivot/tests/issues/pivot929/Pivot929.java
index 5982044..9e0c8cd 100644
--- a/tests/src/org/apache/pivot/tests/issues/pivot929/Pivot929.java
+++ b/tests/src/org/apache/pivot/tests/issues/pivot929/Pivot929.java
@@ -1,55 +1,55 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to you under the Apache License,
- * Version 2.0 (the "License"); you may not use this file except in
- * compliance with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.pivot.tests.issues.pivot929;
-
-import static org.junit.Assert.assertNotNull;
-
-import java.awt.EventQueue;
-
-import org.apache.pivot.wtk.Clipboard;
-import org.apache.pivot.wtk.LocalManifest;
-import org.junit.Test;
-
-public class Pivot929 {
-
-    @Test
-    public void testClipboard() throws Exception {
-        setClipboardContent();
-        waitForEvents();
-        assertNotNull(Clipboard.getContent().getValue("A"));
-        setClipboardContent();
-        waitForEvents();
-        assertNotNull(Clipboard.getContent().getValue("A"));
-    }
-
-    private void setClipboardContent() {
-        LocalManifest manifest = new LocalManifest();
-        manifest.putValue("A", new Object());
-        manifest.putText("A");
-        Clipboard.setContent(manifest);
-    }
-
-    private void waitForEvents() throws Exception {
-        EventQueue.invokeAndWait(new Runnable() {
-            @Override
-            public void run() {
-                // No-op
-            }
-        });
-    }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pivot.tests.issues.pivot929;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.awt.EventQueue;
+
+import org.apache.pivot.wtk.Clipboard;
+import org.apache.pivot.wtk.LocalManifest;
+import org.junit.Test;
+
+public class Pivot929 {
+
+    @Test
+    public void testClipboard() throws Exception {
+        setClipboardContent();
+        waitForEvents();
+        assertNotNull(Clipboard.getContent().getValue("A"));
+        setClipboardContent();
+        waitForEvents();
+        assertNotNull(Clipboard.getContent().getValue("A"));
+    }
+
+    private void setClipboardContent() {
+        LocalManifest manifest = new LocalManifest();
+        manifest.putValue("A", new Object());
+        manifest.putText("A");
+        Clipboard.setContent(manifest);
+    }
+
+    private void waitForEvents() throws Exception {
+        EventQueue.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                // No-op
+            }
+        });
+    }
+
+}
diff --git a/tests/src/org/apache/pivot/tests/tooltip_test.bxml b/tests/src/org/apache/pivot/tests/tooltip_test.bxml
index 00879d1..826f931 100644
--- a/tests/src/org/apache/pivot/tests/tooltip_test.bxml
+++ b/tests/src/org/apache/pivot/tests/tooltip_test.bxml
@@ -1,81 +1,81 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to you under the Apache License,
-Version 2.0 (the "License"); you may not use this file except in
-compliance with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-
-<Window title="Test BXML" maximized="true"
-    xmlns:bxml="http://pivot.apache.org/bxml"
-    xmlns:collections="org.apache.pivot.collections"
-    xmlns:content="org.apache.pivot.wtk.content"
-    xmlns="org.apache.pivot.wtk"
->
-
-    <BoxPane orientation="vertical" styles="{padding:4, verticalAlignment:'center'}">
-        <FlowPane>
-            <Label text="Multi-line&#10;Label:"
-                tooltipText="multi-line&#10;tooltip for the Label"
-                styles="{wrapText:true}"
-            />
-            <PushButton bxml:id="pushButton" buttonData="Button with multi-line tooltip"
-                tooltipText="multi-line&#10;tooltip for the Button"
-            />
-        </FlowPane>
-        <Separator/>
-        <FlowPane>
-            <Label text="Select one element:"/>
-            <ListButton bxml:id="listButton2" buttonData="Number"
-                listData="['One', 'Two', 'Three']"
-                tooltipText="multi-line&#10;tooltip for the List"
-            />
-        </FlowPane>
-        <Separator/>
-        <FlowPane>
-           <Label text="TableView:"/>
-            <TableView bxml:id="tableView" styles="{variableRowHeight:true, backgroundColor:'#ffeeee'}"
-                tooltipText="multi-line&#10;tooltip for the Table"
-            >
-                <columns>
-                    <TableView.Column name="value" width="300">
-                        <cellRenderer>
-                            <content:TableViewCellRenderer styles="{wrapText:true}"/>
-                        </cellRenderer>
-                    </TableView.Column>
-
-                    <TableView.Column width="1*"/>
-                </columns>
-
-                <collections:HashMap value="Single Line"/>
-                <collections:HashMap value="Double&#xA;Line Line Line Line!"/>
-                <collections:HashMap value="Single Line"/>
-                <collections:HashMap value="Double&#xA;Line"/>
-            </TableView>
-        </FlowPane>
-        <Separator/>
-        <FlowPane>
-            <Label text="Multi-line&#10;Label2:"
-                tooltipText="multi-line&#10;tooltip for the Label, but with wrapText false"
-                tooltipWrapText="false"
-                styles="{wrapText:true}"
-            />
-            <PushButton buttonData="Button 2"
-                tooltipText="multi-line&#10;tooltip for the Button, but with wrapText false"
-                tooltipWrapText="false"
-            />
-        </FlowPane>
-        <Separator/>
-    </BoxPane>
-
-</Window>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to you under the Apache License,
+Version 2.0 (the "License"); you may not use this file except in
+compliance with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<Window title="Test BXML" maximized="true"
+    xmlns:bxml="http://pivot.apache.org/bxml"
+    xmlns:collections="org.apache.pivot.collections"
+    xmlns:content="org.apache.pivot.wtk.content"
+    xmlns="org.apache.pivot.wtk"
+>
+
+    <BoxPane orientation="vertical" styles="{padding:4, verticalAlignment:'center'}">
+        <FlowPane>
+            <Label text="Multi-line&#10;Label:"
+                tooltipText="multi-line&#10;tooltip for the Label"
+                styles="{wrapText:true}"
+            />
+            <PushButton bxml:id="pushButton" buttonData="Button with multi-line tooltip"
+                tooltipText="multi-line&#10;tooltip for the Button"
+            />
+        </FlowPane>
+        <Separator/>
+        <FlowPane>
+            <Label text="Select one element:"/>
+            <ListButton bxml:id="listButton2" buttonData="Number"
+                listData="['One', 'Two', 'Three']"
+                tooltipText="multi-line&#10;tooltip for the List"
+            />
+        </FlowPane>
+        <Separator/>
+        <FlowPane>
+           <Label text="TableView:"/>
+            <TableView bxml:id="tableView" styles="{variableRowHeight:true, backgroundColor:'#ffeeee'}"
+                tooltipText="multi-line&#10;tooltip for the Table"
+            >
+                <columns>
+                    <TableView.Column name="value" width="300">
+                        <cellRenderer>
+                            <content:TableViewCellRenderer styles="{wrapText:true}"/>
+                        </cellRenderer>
+                    </TableView.Column>
+
+                    <TableView.Column width="1*"/>
+                </columns>
+
+                <collections:HashMap value="Single Line"/>
+                <collections:HashMap value="Double&#xA;Line Line Line Line!"/>
+                <collections:HashMap value="Single Line"/>
+                <collections:HashMap value="Double&#xA;Line"/>
+            </TableView>
+        </FlowPane>
+        <Separator/>
+        <FlowPane>
+            <Label text="Multi-line&#10;Label2:"
+                tooltipText="multi-line&#10;tooltip for the Label, but with wrapText false"
+                tooltipWrapText="false"
+                styles="{wrapText:true}"
+            />
+            <PushButton buttonData="Button 2"
+                tooltipText="multi-line&#10;tooltip for the Button, but with wrapText false"
+                tooltipWrapText="false"
+            />
+        </FlowPane>
+        <Separator/>
+    </BoxPane>
+
+</Window>
diff --git a/wtk/src/org/apache/pivot/wtk/skin/TabPaneSkin.java b/wtk/src/org/apache/pivot/wtk/skin/TabPaneSkin.java
index e87184b..271987b 100644
--- a/wtk/src/org/apache/pivot/wtk/skin/TabPaneSkin.java
+++ b/wtk/src/org/apache/pivot/wtk/skin/TabPaneSkin.java
@@ -1,44 +1,44 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to you under the Apache License,
- * Version 2.0 (the "License"); you may not use this file except in
- * compliance with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.pivot.wtk.skin;
-
-import org.apache.pivot.wtk.BoxPane;
-import org.apache.pivot.wtk.TabPane;
-
-
-/**
- * Tab pane skin.
- *
- * Note that this class is abstract but only because in layout method there are many things
- * already defined that uses the original skin implementation (TerraTabPaneSkin).
- */
-public abstract class TabPaneSkin extends ContainerSkin
-    implements TabPane.Skin {
-
-    protected BoxPane tabButtonBoxPane = new BoxPane();
-
-    @Override
-    public boolean isVisible(int index) {
-        return tabButtonBoxPane.get(index).isVisible();
-    }
-
-    @Override
-    public void setVisible(int index, boolean value) {
-        tabButtonBoxPane.get(index).setVisible(value);
-    }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pivot.wtk.skin;
+
+import org.apache.pivot.wtk.BoxPane;
+import org.apache.pivot.wtk.TabPane;
+
+
+/**
+ * Tab pane skin.
+ *
+ * Note that this class is abstract but only because in layout method there are many things
+ * already defined that uses the original skin implementation (TerraTabPaneSkin).
+ */
+public abstract class TabPaneSkin extends ContainerSkin
+    implements TabPane.Skin {
+
+    protected BoxPane tabButtonBoxPane = new BoxPane();
+
+    @Override
+    public boolean isVisible(int index) {
+        return tabButtonBoxPane.get(index).isVisible();
+    }
+
+    @Override
+    public void setVisible(int index, boolean value) {
+        tabButtonBoxPane.get(index).setVisible(value);
+    }
+
+}
diff --git a/wtk/src/org/apache/pivot/wtk/validation/LongRangeValidator.java b/wtk/src/org/apache/pivot/wtk/validation/LongRangeValidator.java
index 5ecce04..33a6c35 100644
--- a/wtk/src/org/apache/pivot/wtk/validation/LongRangeValidator.java
+++ b/wtk/src/org/apache/pivot/wtk/validation/LongRangeValidator.java
@@ -1,81 +1,81 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.pivot.wtk.validation;
-
-import java.math.BigInteger;
-import java.util.Locale;
-
-/**
- * A validator for a <tt>long</tt> value limited to a range.
- * <p> {@link BigInteger} math is used here so that proper checks against
- * the limits of the type can be done.
- *
- * @see ComparableRangeValidator
- */
-public class LongRangeValidator extends IntValidator {
-    private long minValue, maxValue;
-
-    public LongRangeValidator() {
-        this.minValue = Long.MIN_VALUE;
-        this.maxValue = Long.MAX_VALUE;
-    }
-
-    public LongRangeValidator(Locale locale) {
-        super(locale);
-        this.minValue = Long.MIN_VALUE;
-        this.maxValue = Long.MAX_VALUE;
-    }
-
-    public LongRangeValidator(long minValue, long maxValue) {
-        this.minValue = minValue;
-        this.maxValue = maxValue;
-    }
-
-    public LongRangeValidator(Locale locale, long minValue, long maxValue) {
-        super(locale);
-        this.minValue = minValue;
-        this.maxValue = maxValue;
-    }
-
-    public long getMinimum() {
-        return minValue;
-    }
-
-    public void setMinimum(long minValue) {
-        this.minValue = minValue;
-    }
-
-    public long getMaximum() {
-        return maxValue;
-    }
-
-    public void setMaximum(long maxValue) {
-        this.maxValue = maxValue;
-    }
-
-    @Override
-    public boolean isValid(String text) {
-        boolean valid = false;
-
-        if (super.isValid(text)) {
-            BigInteger min = BigInteger.valueOf(minValue);
-            BigInteger max = BigInteger.valueOf(maxValue);
-            BigInteger value = new BigInteger(text);
-            valid = value.compareTo(min) >= 0 && value.compareTo(max) <= 0;
-        }
-
-        return valid;
-    }
-
-}
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pivot.wtk.validation;
+
+import java.math.BigInteger;
+import java.util.Locale;
+
+/**
+ * A validator for a <tt>long</tt> value limited to a range.
+ * <p> {@link BigInteger} math is used here so that proper checks against
+ * the limits of the type can be done.
+ *
+ * @see ComparableRangeValidator
+ */
+public class LongRangeValidator extends IntValidator {
+    private long minValue, maxValue;
+
+    public LongRangeValidator() {
+        this.minValue = Long.MIN_VALUE;
+        this.maxValue = Long.MAX_VALUE;
+    }
+
+    public LongRangeValidator(Locale locale) {
+        super(locale);
+        this.minValue = Long.MIN_VALUE;
+        this.maxValue = Long.MAX_VALUE;
+    }
+
+    public LongRangeValidator(long minValue, long maxValue) {
+        this.minValue = minValue;
+        this.maxValue = maxValue;
+    }
+
+    public LongRangeValidator(Locale locale, long minValue, long maxValue) {
+        super(locale);
+        this.minValue = minValue;
+        this.maxValue = maxValue;
+    }
+
+    public long getMinimum() {
+        return minValue;
+    }
+
+    public void setMinimum(long minValue) {
+        this.minValue = minValue;
+    }
+
+    public long getMaximum() {
+        return maxValue;
+    }
+
+    public void setMaximum(long maxValue) {
+        this.maxValue = maxValue;
+    }
+
+    @Override
+    public boolean isValid(String text) {
+        boolean valid = false;
+
+        if (super.isValid(text)) {
+            BigInteger min = BigInteger.valueOf(minValue);
+            BigInteger max = BigInteger.valueOf(maxValue);
+            BigInteger value = new BigInteger(text);
+            valid = value.compareTo(min) >= 0 && value.compareTo(max) <= 0;
+        }
+
+        return valid;
+    }
+
+}
