diff --git a/testing/itest/dynamic/src/test/java/sample/HelloworldReferenceUpdatingImpl.java b/testing/itest/dynamic/src/test/java/sample/HelloworldReferenceUpdatingImpl.java
new file mode 100644
index 0000000..534bec8
--- /dev/null
+++ b/testing/itest/dynamic/src/test/java/sample/HelloworldReferenceUpdatingImpl.java
@@ -0,0 +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 sample;
+
+import org.apache.tuscany.sca.runtime.TuscanyComponentContext;
+import org.apache.tuscany.sca.runtime.TuscanyServiceReference;
+import org.oasisopen.sca.annotation.Context;
+import org.oasisopen.sca.annotation.Reference;
+
+
+public class HelloworldReferenceUpdatingImpl implements Helloworld {
+
+    @Reference
+    Helloworld ref;
+    
+    @Context
+    public TuscanyComponentContext tuscanyComponentContext;
+    
+    public String sayHello(String name) {
+        
+        TuscanyServiceReference<Helloworld> tsr = tuscanyComponentContext.getServiceReference(Helloworld.class, "ref");
+        tsr.setBindingURI("http://localhost:8080/testComponent/Helloworld");
+        
+        return "HelloworldReferenceImpl " + ref.sayHello(name);
+    }
+    
+
+}
diff --git a/testing/itest/dynamic/src/test/java/test/ReferenceUpdateTestCase.java b/testing/itest/dynamic/src/test/java/test/ReferenceUpdateTestCase.java
new file mode 100644
index 0000000..cd2fd7f
--- /dev/null
+++ b/testing/itest/dynamic/src/test/java/test/ReferenceUpdateTestCase.java
@@ -0,0 +1,134 @@
+/*
+ * 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 test;
+
+import javax.xml.namespace.QName;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.apache.tuscany.sca.Node;
+import org.apache.tuscany.sca.TuscanyRuntime;
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.Component;
+import org.apache.tuscany.sca.assembly.ComponentReference;
+import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.binding.ws.WebServiceBinding;
+import org.apache.tuscany.sca.binding.ws.WebServiceBindingFactory;
+import org.apache.tuscany.sca.contribution.Contribution;
+import org.apache.tuscany.sca.contribution.ContributionFactory;
+import org.apache.tuscany.sca.contribution.resolver.ExtensibleModelResolver;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.core.FactoryExtensionPoint;
+import org.apache.tuscany.sca.implementation.java.JavaImplementation;
+import org.apache.tuscany.sca.implementation.java.JavaImplementationFactory;
+import org.junit.Test;
+
+import sample.Helloworld;
+import sample.HelloworldReferenceUpdatingImpl;
+
+/**
+ * This shows dynamically altering a ws reference target uri during a component invocation.
+ * Same as the WSReferenceTestCase but uses a different component impl class and sets an 
+ * incorrect target uri on the reference initially which is then updated during the invocation
+ */
+public class ReferenceUpdateTestCase extends TestCase {
+
+    private TuscanyRuntime tuscanyRuntime;
+    private ExtensionPointRegistry extensionPoints;
+    private FactoryExtensionPoint modelFactories;
+    private Node node;
+    private WSServiceTestCase wsService;
+
+    @Override
+    protected void setUp() throws Exception {
+        tuscanyRuntime = TuscanyRuntime.newInstance();
+        extensionPoints = tuscanyRuntime.getExtensionPointRegistry();
+        modelFactories = extensionPoints.getExtensionPoint(FactoryExtensionPoint.class);
+        node = tuscanyRuntime.createNode();
+        
+        // start the WSServicetestCase service
+        wsService = new WSServiceTestCase();
+        wsService.setUp();
+        wsService.testInvoke();
+    }
+
+    @Test
+    public void testInvoke() throws Exception {
+
+        // Create a contribution
+        ContributionFactory contributionFactory = modelFactories.getFactory(ContributionFactory.class);
+        Contribution contribution = contributionFactory.createContribution();
+        contribution.setURI("testContribution");
+        ModelResolverExtensionPoint modelResolvers = extensionPoints.getExtensionPoint(ModelResolverExtensionPoint.class);
+        ModelResolver modelResolver = new ExtensibleModelResolver(contribution, modelResolvers, modelFactories);
+        contribution.setModelResolver(modelResolver);
+        contribution.setClassLoader(HelloworldReferenceUpdatingImpl.class.getClassLoader());
+
+        // Create a composite
+        AssemblyFactory assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
+        Composite composite = assemblyFactory.createComposite();
+        composite.setURI("testComposite");
+        composite.setName(new QName("testComposite"));
+
+        // create a component
+        Component component = assemblyFactory.createComponent();
+        component.setName("testComponent");        
+        
+        // create an implementation and set it on the component
+        JavaImplementationFactory javaImplementationFactory = modelFactories.getFactory(JavaImplementationFactory.class);
+        JavaImplementation javaImplementation = javaImplementationFactory.createJavaImplementation(HelloworldReferenceUpdatingImpl.class);
+        javaImplementation.setJavaClass(HelloworldReferenceUpdatingImpl.class);
+        component.setImplementation(javaImplementation);
+
+        // create a WS reference
+        ComponentReference cr = assemblyFactory.createComponentReference();
+        cr.setName("ref");
+        WebServiceBindingFactory webServiceBindingFactory = modelFactories.getFactory(WebServiceBindingFactory.class);
+        WebServiceBinding wsBinding = webServiceBindingFactory.createWebServiceBinding();
+        wsBinding.setURI("http://localhost:8080/some/incorrect/url/that/test/will/fix");
+        cr.getBindings().add(wsBinding);
+
+        // Add the WS service to the component
+        component.getReferences().add(cr);
+
+        // add the component to the composite
+        composite.getComponents().add(component);
+
+        // add the composite to the contribution
+        contribution.addComposite(composite);
+
+        // Now install the contribution and start the composite
+        node.installContribution(contribution, null);
+        node.startComposite(contribution.getURI(), composite.getURI());
+
+        // test that the service has started and can be invoked
+        Helloworld service = node.getService(Helloworld.class, "testComponent/Helloworld");
+        Assert.assertEquals("HelloworldReferenceImpl Hello Ariana", service.sayHello("Ariana"));
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        node.stop();
+        tuscanyRuntime.stop();
+        wsService.tearDown();
+    }
+}
