diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index d4911d7ff5..aa22b2b1c2 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -5721,13 +5721,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                         if (remain < 7)
                             return;
 
-                        LSL_Types.LSLInteger flexi = new LSL_Types.LSLInteger(rules.Data[idx++].ToString());
-                        int softness = Convert.ToInt32(rules.Data[idx++]);
-                        float gravity = (float)Convert.ToDouble(rules.Data[idx++]);
-                        float friction = (float)Convert.ToDouble(rules.Data[idx++]);
-                        float wind = (float)Convert.ToDouble(rules.Data[idx++]);
-                        float tension = (float)Convert.ToDouble(rules.Data[idx++]);
-                        LSL_Types.Vector3 force =new LSL_Types.Vector3(rules.Data[idx++].ToString());
+                        bool flexi = (LSL_Types.LSLInteger)rules.Data[idx++];
+                        int softness = (LSL_Types.LSLInteger)rules.Data[idx++];
+                        float gravity = (float)(LSL_Types.LSLFloat)rules.Data[idx++];
+                        float friction = (float)(LSL_Types.LSLFloat)rules.Data[idx++];
+                        float wind = (float)(LSL_Types.LSLFloat)rules.Data[idx++];
+                        float tension = (float)(LSL_Types.LSLFloat)rules.Data[idx++];
+                        LSL_Types.Vector3 force = (LSL_Types.Vector3)rules.Data[idx++];
 
                         SetFlexi(part, flexi, softness, gravity, friction, wind, tension, force);
 
diff --git a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
index 3e63808912..85abdb0bac 100644
--- a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
@@ -1569,9 +1569,14 @@ namespace OpenSim.Region.ScriptEngine.Shared
 
             #region Operators
 
+            static public explicit operator float(LSLFloat f)
+            {
+              return (float)f.value;
+            }
+
             static public explicit operator int(LSLFloat f)
             {
-                return (int)f.value;
+              return (int)f.value;
             }
 
             static public explicit operator uint(LSLFloat f)
diff --git a/OpenSim/Tests/OpenSim/Region/ScriptEngine/Shared/LSL_TypesTestLSLFloat.cs b/OpenSim/Tests/OpenSim/Region/ScriptEngine/Shared/LSL_TypesTestLSLFloat.cs
index c021963f7a..272d06c1f3 100644
--- a/OpenSim/Tests/OpenSim/Region/ScriptEngine/Shared/LSL_TypesTestLSLFloat.cs
+++ b/OpenSim/Tests/OpenSim/Region/ScriptEngine/Shared/LSL_TypesTestLSLFloat.cs
@@ -395,6 +395,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
             }
         }
 
+        /// 
+        /// Tests LSLFloat is correctly cast explicitly to float
+        /// 
+        [Test]
+        public void TestExplicitCastLSLFloatToFloat()
+        {
+          float testFloat;
+          float numberAsFloat;
+          LSL_Types.LSLFloat testLSLFloat;
+          foreach (double number in m_doubleList)
+          {
+            testLSLFloat = new LSL_Types.LSLFloat(number);
+            numberAsFloat = (float)number;
+            testFloat = (float)testLSLFloat;
+
+            Assert.That((double)testFloat, new DoubleToleranceConstraint((double)numberAsFloat, _lowPrecisionTolerance));
+          }
+        }
+
+
         /// 
         /// Tests the equality (==) operator.
         /// 
diff --git a/OpenSim/Tests/OpenSim/Region/ScriptEngine/Shared/LSL_TypesTestList.cs b/OpenSim/Tests/OpenSim/Region/ScriptEngine/Shared/LSL_TypesTestList.cs
index c1c9ef77c1..9e8d7169f6 100644
--- a/OpenSim/Tests/OpenSim/Region/ScriptEngine/Shared/LSL_TypesTestList.cs
+++ b/OpenSim/Tests/OpenSim/Region/ScriptEngine/Shared/LSL_TypesTestList.cs
@@ -84,18 +84,79 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
         [Test]
         public void TestConcatenateDouble()
         {
-            LSL_Types.list testList = new LSL_Types.list(1, 'a', "test");
-            testList += 2.0;
+          LSL_Types.list testList = new LSL_Types.list(1, 'a', "test");
+          testList += 2.0;
 
-            Assert.AreEqual(4, testList.Length);
-            Assert.AreEqual(2.0, testList.Data[3]);
-            Assert.AreEqual(typeof(double), testList.Data[3].GetType());
+          Assert.AreEqual(4, testList.Length);
+          Assert.AreEqual(2.0, testList.Data[3]);
+          Assert.AreEqual(typeof(double), testList.Data[3].GetType());
 
-            LSL_Types.list secondTestList = testList + 0.04;
+          LSL_Types.list secondTestList = testList + 0.04;
 
-            Assert.AreEqual(5, secondTestList.Length);
-            Assert.AreEqual(0.04, secondTestList.Data[4]);
-            Assert.AreEqual(typeof(double), secondTestList.Data[4].GetType());
+          Assert.AreEqual(5, secondTestList.Length);
+          Assert.AreEqual(0.04, secondTestList.Data[4]);
+          Assert.AreEqual(typeof(double), secondTestList.Data[4].GetType());
         }
+
+        /// 
+        /// Tests casting LSLInteger item to LSLInteger.
+        /// 
+        [Test]
+        public void TestCastLSLIntegerItemToLSLInteger()
+        {
+          LSL_Types.LSLInteger testValue = new LSL_Types.LSLInteger(123);
+          LSL_Types.list testList = new LSL_Types.list(testValue);
+
+          Assert.AreEqual(testValue, (LSL_Types.LSLInteger)testList.Data[0]);
+        }
+
+        /// 
+        /// Tests casting LSLFloat item to LSLFloat.
+        /// 
+        [Test]
+        public void TestCastLSLFloatItemToLSLFloat()
+        {
+          LSL_Types.LSLFloat testValue = new LSL_Types.LSLFloat(123.45678987);
+          LSL_Types.list testList = new LSL_Types.list(testValue);
+
+          Assert.AreEqual(testValue, (LSL_Types.LSLFloat)testList.Data[0]);
+        }
+
+        /// 
+        /// Tests casting LSLString item to LSLString.
+        /// 
+        [Test]
+        public void TestCastLSLStringItemToLSLString()
+        {
+          LSL_Types.LSLString testValue = new LSL_Types.LSLString("hello there");
+          LSL_Types.list testList = new LSL_Types.list(testValue);
+
+          Assert.AreEqual(testValue, (LSL_Types.LSLString)testList.Data[0]);
+        }
+
+        /// 
+        /// Tests casting Vector3 item to Vector3.
+        /// 
+        [Test]
+        public void TestCastVector3ItemToVector3()
+        {
+          LSL_Types.Vector3 testValue = new LSL_Types.Vector3(12.34, 56.987654, 0.00987);
+          LSL_Types.list testList = new LSL_Types.list(testValue);
+
+          Assert.AreEqual(testValue, (LSL_Types.Vector3)testList.Data[0]);
+        }
+        /// 
+        /// Tests casting Quaternion item to Quaternion.
+        /// 
+        [Test]
+        public void TestCastQuaternionItemToQuaternion()
+        {
+          LSL_Types.Quaternion testValue = new LSL_Types.Quaternion(12.34, 56.44323, 765.983421, 0.00987);
+          LSL_Types.list testList = new LSL_Types.list(testValue);
+
+          Assert.AreEqual(testValue, (LSL_Types.Quaternion)testList.Data[0]);
+        }
+
+
     }
 }