diff --git a/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ClassChecker.java b/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ClassChecker.java
index 3967d5e..cced500 100644
--- a/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ClassChecker.java
+++ b/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ClassChecker.java
@@ -157,7 +157,7 @@
      * Check if the class was already manipulated.
      * @return true if the class is already manipulated.
      */
-    public boolean isalreadyManipulated() {
+    public boolean isAlreadyManipulated() {
         return m_isAlreadyManipulated;
     }
 
diff --git a/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/Manipulator.java b/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/Manipulator.java
index 9a15d55..a9d439b 100644
--- a/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/Manipulator.java
+++ b/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/Manipulator.java
@@ -97,7 +97,7 @@
         m_version = ck.getClassVersion();
 
         ClassWriter finalWriter = null;
-        if (!ck.isalreadyManipulated()) {
+        if (!ck.isAlreadyManipulated()) {
             // Manipulation ->
             // Add the _setComponentManager method
             // Instrument all fields
@@ -115,7 +115,7 @@
             finalWriter = cw0;
         }
         // The file is in the bundle
-        if (ck.isalreadyManipulated()) {
+        if (ck.isAlreadyManipulated()) {
             return origin;
         } else {
             return finalWriter.toByteArray();
diff --git a/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCreator.java b/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCreator.java
index 8513ce1..ca5de8e 100644
--- a/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCreator.java
+++ b/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCreator.java
@@ -19,11 +19,7 @@
 
 package org.apache.felix.ipojo.manipulation;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 import org.apache.felix.ipojo.manipulation.ClassChecker.AnnotationDescriptor;
 import org.objectweb.asm.ClassAdapter;
@@ -194,7 +190,8 @@
             Type[] args = Type.getArgumentTypes(desc);
 
             // TODO HERE ! => All constructor matches, no distinction between the different constructors.
-            generateConstructor(access, desc, signature, exceptions, md.getAnnotations(), md.getParameterAnnotations());
+            generateConstructor(access, desc, signature, exceptions, md.getAnnotations(),
+                    md.getParameterAnnotations(), md.getLocals());
 
             if (args.length == 0) {
                 m_foundSuitableConstructor = true;
@@ -222,7 +219,8 @@
         if (md == null) {
             generateMethodHeader(access, name, desc, signature, exceptions, null, null, null);
         } else {
-            generateMethodHeader(access, name, desc, signature, exceptions, md.getArgumentLocalVariables(), md.getAnnotations(), md.getParameterAnnotations());
+            generateMethodHeader(access, name, desc, signature, exceptions, md.getArgumentLocalVariables(),
+                    md.getAnnotations(), md.getParameterAnnotations());
         }
 
         String id = generateMethodFlag(name, desc);
@@ -308,8 +306,11 @@
      * @param signature : method signature
      * @param exceptions : declared exception
      * @param annotations : the annotations to move to this constructor.
+     * @param locals : the local variables from the original constructors.
      */
-    private void generateConstructor(int access, String descriptor, String signature, String[] exceptions, List<AnnotationDescriptor> annotations, Map<Integer, List<AnnotationDescriptor>> paramAnnotations) {
+    private void generateConstructor(int access, String descriptor, String signature, String[] exceptions,
+                                     List<AnnotationDescriptor> annotations, Map<Integer,
+            List<AnnotationDescriptor>> paramAnnotations, LinkedHashMap<Integer, LocalVariableNode> locals) {
          GeneratorAdapter mv = new GeneratorAdapter(
                  cv.visitMethod(access, "<init>", descriptor, signature, exceptions),
                  access, "<init>", descriptor);
@@ -318,11 +319,15 @@
          newDesc = "(Lorg/apache/felix/ipojo/InstanceManager;" + newDesc;
 
          mv.visitCode();
+         Label start = new Label();
+         mv.visitLabel(start);
          mv.visitVarInsn(ALOAD, 0);
          mv.visitInsn(ACONST_NULL);
          mv.loadArgs();
          mv.visitMethodInsn(INVOKESPECIAL, m_owner, "<init>", newDesc);
          mv.visitInsn(RETURN);
+         Label stop = new Label();
+         mv.visitLabel(stop);
 
          // Move annotations
          if (annotations != null) {
@@ -345,6 +350,16 @@
              }
          }
 
+         // Add local variables for the arguments.
+        for (Map.Entry<Integer, LocalVariableNode> local : locals.entrySet()) {
+            // Write the parameter name. Only write the local variable that are either `this` or parameters from the
+            // initial descriptor.
+            if (local.getValue().index <= Type.getArgumentTypes(descriptor).length) {
+                mv.visitLocalVariable(local.getValue().name, local.getValue().desc, local.getValue().signature, start,stop,
+                        local.getValue().index);
+            }
+        }
+
          mv.visitMaxs(0, 0);
          mv.visitEnd();
     }
@@ -362,7 +377,9 @@
      * @param annotations : the annotations to move to this method.
      * @param paramAnnotations : the parameter annotations to move to this method.
      */
-    private void generateMethodHeader(int access, String name, String desc, String signature, String[] exceptions, List<LocalVariableNode> localVariables, List<AnnotationDescriptor> annotations, Map<Integer, List<AnnotationDescriptor>> paramAnnotations) {
+    private void generateMethodHeader(int access, String name, String desc, String signature, String[] exceptions,
+                                      List<LocalVariableNode> localVariables, List<AnnotationDescriptor> annotations,
+                                      Map<Integer, List<AnnotationDescriptor>> paramAnnotations) {
         GeneratorAdapter mv = new GeneratorAdapter(cv.visitMethod(access, name, desc, signature, exceptions), access, name, desc);
 
         // If we have variables, we wraps the code within labels. The `lifetime` of the variables are bound to those
diff --git a/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodDescriptor.java b/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodDescriptor.java
index a477560..fe0890c 100644
--- a/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodDescriptor.java
+++ b/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodDescriptor.java
@@ -259,4 +259,7 @@
         return m_argLocalVariables;
     }
 
+    public LinkedHashMap<Integer, LocalVariableNode> getLocals() {
+        return m_locals;
+    }
 }
diff --git a/ipojo/manipulator/manipulator/src/test/java/org/apache/felix/ipojo/manipulation/ClassCheckerTestCase.java b/ipojo/manipulator/manipulator/src/test/java/org/apache/felix/ipojo/manipulation/ClassCheckerTestCase.java
index 9e7398e..ca0f95b 100644
--- a/ipojo/manipulator/manipulator/src/test/java/org/apache/felix/ipojo/manipulation/ClassCheckerTestCase.java
+++ b/ipojo/manipulator/manipulator/src/test/java/org/apache/felix/ipojo/manipulation/ClassCheckerTestCase.java
@@ -39,12 +39,12 @@
 
     public void testIsAlreadyManipulatedWithNotManipulatedResource() throws Exception {
         ClassChecker checker = check(resource("test/SimplePojo.class"));
-        assertFalse(checker.isalreadyManipulated());
+        assertFalse(checker.isAlreadyManipulated());
     }
 
     public void testIsAlreadyManipulatedWithManipulatedResource() throws Exception {
         ClassChecker checker = check(manipulate(resource("test/SimplePojo.class")));
-        assertTrue(checker.isalreadyManipulated());
+        assertTrue(checker.isAlreadyManipulated());
     }
 
     public void testMetadataForAlreadyManipulatedClassAreCleaned() throws Exception {
diff --git a/ipojo/manipulator/manipulator/src/test/java/test/PlentyOfAnnotations.java b/ipojo/manipulator/manipulator/src/test/java/test/PlentyOfAnnotations.java
index 9aa65ec..b6d11ed 100644
--- a/ipojo/manipulator/manipulator/src/test/java/test/PlentyOfAnnotations.java
+++ b/ipojo/manipulator/manipulator/src/test/java/test/PlentyOfAnnotations.java
@@ -56,4 +56,8 @@
         // ...
     }
 
+    public String doSomethingWithArguments(String message, int value) {
+        return message + " - " + value;
+    }
+
 }
