diff --git a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj
index 4466bb7cb9..6c9889782d 100644
--- a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj
+++ b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj
@@ -247,6 +247,7 @@
+
diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/SplitDeclarationListAction.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/SplitDeclarationListAction.cs
new file mode 100644
index 0000000000..c6cdb62985
--- /dev/null
+++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/SplitDeclarationListAction.cs
@@ -0,0 +1,93 @@
+//
+// SplitDeclarationListAction.cs
+//
+// Author:
+// Mansheng Yang
+//
+// Copyright (c) 2012 Mansheng Yang
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace ICSharpCode.NRefactory.CSharp.Refactoring
+{
+ [ContextAction ("Split declaration list",
+ Description = "Split variable declaration with multiple variables into declarations with a single variable")]
+ public class SplitDeclarationListAction : ICodeActionProvider
+ {
+ public IEnumerable GetActions (RefactoringContext context)
+ {
+ // field, local var, event, fixed var, fixed field
+
+ // local variable
+ var variableDecl = context.GetNode ();
+ if (variableDecl != null && variableDecl.Parent is BlockStatement) {
+ return GetAction (context, variableDecl, v => v.Variables);
+ }
+
+ // field
+ var fieldDecl = context.GetNode ();
+ if (fieldDecl != null)
+ return GetAction (context, fieldDecl, f => f.Variables);
+
+ // event
+ var eventDecl = context.GetNode ();
+ if (eventDecl != null)
+ return GetAction (context, eventDecl, e => e.Variables);
+
+ // fixed field
+ var fixedFieldDecl = context.GetNode ();
+ if (fixedFieldDecl != null)
+ return GetAction (context, fixedFieldDecl, f => f.Variables);
+
+ return Enumerable.Empty ();
+ }
+
+ IEnumerable GetAction (RefactoringContext context, T decl,
+ Func> getInitializers)
+ where T : AstNode
+ where S : AstNode
+ {
+ var initializers = getInitializers(decl);
+ if (initializers.Count < 2)
+ yield break;
+
+ yield return new CodeAction (context.TranslateString ("Split declaration list"),
+ script =>
+ {
+ var emptyDecl = (T)decl.Clone ();
+ getInitializers (emptyDecl).Clear ();
+
+ var declList = initializers.Select (v =>
+ {
+ var singleDecl = (T)emptyDecl.Clone ();
+ getInitializers(singleDecl).Add ((S)v.Clone ());
+ return singleDecl;
+ });
+
+ foreach (var singleDecl in declList)
+ script.InsertBefore (decl, singleDecl);
+ script.Remove (decl);
+ });
+ }
+ }
+}
diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/SplitDeclarationListTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/SplitDeclarationListTests.cs
new file mode 100644
index 0000000000..7598e66ccb
--- /dev/null
+++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/SplitDeclarationListTests.cs
@@ -0,0 +1,132 @@
+//
+// SplitDeclarationListTests.cs
+//
+// Author:
+// Mansheng Yang
+//
+// Copyright (c) 2012 Mansheng Yang
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using ICSharpCode.NRefactory.CSharp.Refactoring;
+using NUnit.Framework;
+
+namespace ICSharpCode.NRefactory.CSharp.CodeActions
+{
+ [TestFixture]
+ public class SplitDeclarationListTests : ContextActionTestBase
+ {
+ [Test]
+ public void TestLocalVariable ()
+ {
+ Test (@"
+class TestClass
+{
+ void TestMethod()
+ {
+ int $a, b, c;
+ }
+}", @"
+class TestClass
+{
+ void TestMethod()
+ {
+ int a;
+ int b;
+ int c;
+ }
+}");
+ }
+
+ [Test]
+ public void TestField ()
+ {
+ Test (@"
+class TestClass
+{
+ public int $a, b, c;
+}", @"
+class TestClass
+{
+ public int a;
+ public int b;
+ public int c;
+}");
+ }
+
+ [Test]
+ public void TestEvent ()
+ {
+ Test (@"
+class TestClass
+{
+ event System.EventHandler $a, b, c;
+}", @"
+class TestClass
+{
+ event System.EventHandler a;
+ event System.EventHandler b;
+ event System.EventHandler c;
+}");
+ }
+
+ [Test]
+ public void TestFixedField ()
+ {
+ Test (@"
+class TestClass
+{
+ unsafe fixed int $a[10], b[10], c[10];
+}", @"
+class TestClass
+{
+ unsafe fixed int a[10];
+ unsafe fixed int b[10];
+ unsafe fixed int c[10];
+}");
+ }
+
+ [Test]
+ public void TestVariableInFor ()
+ {
+ TestWrongContext (@"
+class TestClass
+{
+ void TestMethod ()
+ {
+ for (int a = 0, b = 0, $c = 0; a < 10; a++) {
+ }
+ }
+}");
+ }
+
+ [Test]
+ public void TestSingleVariable ()
+ {
+ TestWrongContext (@"
+class TestClass
+{
+ void TestMethod ()
+ {
+ int $a;
+ }
+}");
+ }
+ }
+}
diff --git a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj
index 49eb0ead5c..183dd155a7 100644
--- a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj
+++ b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj
@@ -87,6 +87,7 @@
+