diff --git a/wookie-connector/java/src/main/java/org/apache/wookie/connector/framework/AbstractWookieConnectorService.java b/wookie-connector/java/src/main/java/org/apache/wookie/connector/framework/AbstractWookieConnectorService.java
index ceab972..2f60283 100644
--- a/wookie-connector/java/src/main/java/org/apache/wookie/connector/framework/AbstractWookieConnectorService.java
+++ b/wookie-connector/java/src/main/java/org/apache/wookie/connector/framework/AbstractWookieConnectorService.java
@@ -538,87 +538,6 @@
 		}
 	}
 
-
-	/**
-	 * Gets a list of all the api keys registered in wookie
-	 * @param adminUsername
-	 * @param adminPassword
-	 * @return
-	 * @throws WookieConnectorException
-	 * @throws IOException
-	 */
-	public List<ApiKey> getAPIKeys() throws WookieConnectorException, IOException {
-
-		SignedApiRequest request = SignedApiRequest.GET(conn.getURL()+"/keys", conn.getApiKey(), conn.getSecret());
-		request.execute();
-
-		ArrayList<ApiKey> keys =  new ArrayList<ApiKey>();
-		try {
-			Document doc = parseInputStreamAsDocument ( request.getResponseBodyAsStream() );
-			Element rootElement = doc.getDocumentElement();
-			NodeList keyNodes = rootElement.getElementsByTagName("key");
-			for ( int i = 0; i < keyNodes.getLength(); i++ ) {
-				Element keyElement = (Element) keyNodes.item(i);
-				ApiKey key = new ApiKey (
-						keyElement.getTextContent(),
-						null);
-				keys.add(key);
-			}
-		}
-		catch ( MalformedURLException e ) {
-			throw new WookieConnectorException ( "Bad url: ", e);
-		} 
-		catch (ParserConfigurationException e) {
-			e.printStackTrace();
-			throw new WookieConnectorException ( "Problem parsing data returned by Wookie: ", e);
-		} 
-		catch (SAXException e) {
-			e.printStackTrace();
-			throw new WookieConnectorException ( "Problem parsing data returned by Wookie: ", e);
-		}
-		return keys;
-	}
-
-
-	/**
-	 * Creates a new api key
-	 * @param newKey
-	 * @param adminUsername
-	 * @param adminPassword
-	 * @throws WookieConnectorException
-	 */
-	public void createApiKey ( ApiKey newKey) throws WookieConnectorException {
-		
-		SignedApiRequest request = SignedApiRequest.POST(conn.getURL()+"/keys", conn.getApiKey(), conn.getSecret());
-		request.addParameter("apikey", newKey.getKey());
-		request.addParameter("email", newKey.getSecret());
-		try {
-			request.execute();
-		} catch (IOException e) {
-			throw new WookieConnectorException("Problem adding an apikey.", e);
-		}
-		if (request.getStatusCode() != 201){
-			throw new WookieConnectorException("Problem adding an apikey. ", new IOException("Error:"+request.getStatusCode()));
-		}
-	}
-
-
-	/**
-	 * Deletes a specified key
-	 * @param key
-	 * @throws IOException
-	 * @throws WookieConnectorException
-	 */
-	public void removeApiKey ( ApiKey key) throws IOException, WookieConnectorException {
-		SignedApiRequest request = SignedApiRequest.DELETE(conn.getURL()+"/keys/"+key.getKey(), conn.getApiKey(), conn.getSecret());
-		request.execute();
-			if ( request.getStatusCode() != 200 ) {
-				throw new IOException ("Problem DELETEing from /keys");
-			}
-	}
-
-
-
 	/**
 	 * Returns a full list of policies
 	 * @param adminUsername
diff --git a/wookie-connector/java/src/main/java/org/apache/wookie/connector/framework/ApiKey.java b/wookie-connector/java/src/main/java/org/apache/wookie/connector/framework/ApiKey.java
deleted file mode 100644
index 3758731..0000000
--- a/wookie-connector/java/src/main/java/org/apache/wookie/connector/framework/ApiKey.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  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.wookie.connector.framework;
-
-public class ApiKey {
-	
-	private String key;
-	private String secret;
-
-	
-	
-	public ApiKey ( String key, String secret ) {
-		this.key = key;
-		this.secret = secret;
-	}
-	
-	
-	/**
-	 * @return the key
-	 */
-	public String getKey() {
-		return key;
-	}
-	/**
-	 * @param key the key to set
-	 */
-	public void setKey(String key) {
-		this.key = key;
-	}
-	/**
-	 * @return the secret
-	 */
-	public String getSecret() {
-		return secret;
-	}
-	/**
-	 * @param email the email to set
-	 */
-	public void setSecret(String secret) {
-		this.secret = secret;
-	}
-	
-	
-
-}
diff --git a/wookie-connector/java/src/test/java/org/apache/wookie/tests/connector/framework/impl/WookieConnectorService.java b/wookie-connector/java/src/test/java/org/apache/wookie/tests/connector/framework/impl/WookieConnectorService.java
index da5c5ff..910bf6d 100644
--- a/wookie-connector/java/src/test/java/org/apache/wookie/tests/connector/framework/impl/WookieConnectorService.java
+++ b/wookie-connector/java/src/test/java/org/apache/wookie/tests/connector/framework/impl/WookieConnectorService.java
@@ -21,9 +21,7 @@
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.List;
-import java.util.ListIterator;
 
-import org.apache.wookie.connector.framework.ApiKey;
 import org.apache.wookie.connector.framework.Policy;
 import org.apache.wookie.connector.framework.User;
 import org.apache.wookie.connector.framework.Widget;
@@ -237,32 +235,6 @@
   
   
   @Test
-  public void apikeys() throws IOException, WookieConnectorException {
-	  
-	  List<ApiKey> apikeys = service.getAPIKeys();
-	  int apikeysLength = apikeys.size();
-	  assertTrue ( "Unable to get api keys", ( apikeysLength > 0));
-	  ApiKey newKey = new ApiKey ("tester", "test@test.com" );
-	  service.createApiKey(newKey);
-	  
-	  apikeys = service.getAPIKeys();
-	  
-	  boolean foundKey = false;
-	  ListIterator<ApiKey> li = apikeys.listIterator();
-	  while (li.hasNext()) {
-		  ApiKey akey = li.next();
-		  if ( akey.getKey().equals("tester")) {
-			  foundKey = true;
-		  }
-	  }
-	  assertTrue ( "New key not created", foundKey );
-	  
-	  service.removeApiKey(newKey);
-	  assertEquals ( service.getAPIKeys().size(), apikeysLength);
-  }
-  
-  
-  @Test
   public void policyTest ( ) throws IOException, WookieConnectorException {
 	  
 	  List<Policy> policies = service.getPolicies(null);
diff --git a/wookie-server/src/main/java/org/apache/wookie/controller/ApiKeyController.java b/wookie-server/src/main/java/org/apache/wookie/controller/ApiKeyController.java
deleted file mode 100644
index aef3646..0000000
--- a/wookie-server/src/main/java/org/apache/wookie/controller/ApiKeyController.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * 
- * 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.wookie.controller;
-
-import java.io.IOException;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.log4j.Logger;
-import org.apache.wookie.exceptions.InvalidParametersException;
-import org.apache.wookie.exceptions.ResourceDuplicationException;
-import org.apache.wookie.exceptions.ResourceNotFoundException;
-import org.apache.wookie.exceptions.UnauthorizedAccessException;
-import org.apache.wookie.helpers.ApiKeyHelper;
-import org.apache.wookie.server.security.ApiKeys;
-
-/**
- * Admin controller for creating, updating and listing API keys
- * 
- * <ul>
- * <li>GET /keys - index <em>requires authentication</em></li>
- * <li>POST /keys {apikey, email} - create <em>requires authentication</em></li>
- * <li>PUT /keys/{id} {apikey, email} - update <em>requires authentication</em></li>
- * <li>DELETE /keys/{id} - remove <em>requires authentication</em></li>
- * </ul>
- * 
- * Note that PUT support is disabled until a solution is available for migrating
- * widget instances, shared data and participants
- */
-
-public class ApiKeyController extends Controller {
-
-  private static final long serialVersionUID = -2985087125119757793L;
-  static Logger _logger = Logger.getLogger(ApiKeyController.class.getName()); 
-
-  /* (non-Javadoc)
-   * @see org.apache.wookie.controller.Controller#index(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
-   */
-  @Override
-  protected void index(HttpServletRequest request, HttpServletResponse response)
-      throws UnauthorizedAccessException, IOException {
-    switch (format(request)) {
-    case XML: returnXml(ApiKeyHelper.toXml(ApiKeys.getInstance().getKeys()),response);break;
-    case JSON: returnJson(ApiKeyHelper.toJson(ApiKeys.getInstance().getKeys()),response);break;
-    default: returnXml(ApiKeyHelper.toXml(ApiKeys.getInstance().getKeys()),response);break;
-    }
-  }
-
-  /* (non-Javadoc)
-   * @see org.apache.wookie.controller.Controller#create(java.lang.String, javax.servlet.http.HttpServletRequest)
-   */
-  @Override
-  protected boolean create(String resourceId, HttpServletRequest request, HttpServletResponse response)
-      throws ResourceDuplicationException, InvalidParametersException,
-      UnauthorizedAccessException {
-    String value = request.getParameter("apikey");
-    String email = request.getParameter("email");
-    if (value == null || email == null || value.trim().length() ==0 || email.trim().length() == 0) throw new InvalidParametersException();
-    
-    try {
-      ApiKeys.getInstance().addKey(value, email);
-      _logger.info("New API key registered for "+email);
-    } catch (Exception e) {
-      throw new ResourceDuplicationException();  
-    }
-    
-    return true;
-  }
-
-  
-/*
-  @Override
-  protected void update(String resourceId, HttpServletRequest request)
-      throws ResourceNotFoundException, InvalidParametersException,
-      UnauthorizedAccessException {
-
-    String value = request.getParameter("apikey");
-    String email = request.getParameter("email");
-    if (value == null || email == null || value.trim().length() ==0 || email.trim().length() == 0) throw new InvalidParametersException();
-    
-    IPersistenceManager persistenceManager = PersistenceManagerFactory.getPersistenceManager();
-    IApiKey apiKey = persistenceManager.findById(IApiKey.class, resourceId);
-    if (apiKey == null) throw new ResourceNotFoundException();
-    String oldValue = apiKey.getValue();
-    String oldEmail = apiKey.getEmail();
-    apiKey.setEmail(email);
-    apiKey.setValue(value);
-    persistenceManager.save(apiKey);
-    migrateWidgetInstances(apiKey, oldValue);
-    _logger.info("API key updated from "+oldEmail+" : "+oldValue + " to "+email + " : "+value);
-
-  }
-*/
-
-  
-  /**
-   * Migrates any widget instances using the previous key to the new key.
-   * @param key
-   * @param oldValue
-   */
- /*
-  private void migrateWidgetInstances(IApiKey apiKey, String oldValue){
-    IPersistenceManager persistenceManager = PersistenceManagerFactory.getPersistenceManager();
-    // 
-    IWidgetInstance[] instances = persistenceManager.findByValue(IWidgetInstance.class, "apiKey", oldValue);
-    for (IWidgetInstance instance: instances){
-      //FIXME this doesn't really work right now because we can't migrate the shared data key. To do
-      //      this we would need to store both the original shared data key and the internal version in the WidgetInstance or
-      //      somewhere. (We then ought to rename one of them to make it clear which it is). We could then transparently
-      //      update all the sharedDataKeys for instances, participants and shared data
-      instance.setApiKey(apiKey.getValue());
-      persistenceManager.save(instance);
-    }
-  }
- */
-
-  /* (non-Javadoc)
-   * @see org.apache.wookie.controller.Controller#remove(java.lang.String, javax.servlet.http.HttpServletRequest)
-   */
-  @Override
-  protected boolean remove(String resourceId, HttpServletRequest request)
-      throws ResourceNotFoundException, UnauthorizedAccessException,
-      InvalidParametersException {
-    
-      ApiKeys.getInstance().removeKey(resourceId);
-      _logger.info("API key deleted: "+resourceId); 
-      return true;
-  }
-  
-}
diff --git a/wookie-server/src/main/webapp/WEB-INF/web.xml b/wookie-server/src/main/webapp/WEB-INF/web.xml
index 0f7e7d3..7d7ef9e 100644
--- a/wookie-server/src/main/webapp/WEB-INF/web.xml
+++ b/wookie-server/src/main/webapp/WEB-INF/web.xml
@@ -140,20 +140,6 @@
 		<servlet-name>PropertiesServlet</servlet-name>
 		<url-pattern>/properties</url-pattern>
 	</servlet-mapping>
-	
-	<servlet>
-		<description></description>
-		<display-name>ApiKeys</display-name>
-		<servlet-name>ApiKeyController</servlet-name>
-		<servlet-class>
-			org.apache.wookie.controller.ApiKeyController
-		</servlet-class>
-		<load-on-startup>2</load-on-startup>
-	</servlet>	
-	<servlet-mapping>
-		<servlet-name>ApiKeyController</servlet-name>
-		<url-pattern>/keys/*</url-pattern>
-	</servlet-mapping>
 
 	<servlet>
 		<description></description>
@@ -338,10 +324,6 @@
     	<filter-name>AuthorizationFilter</filter-name>
 		<servlet-name>PoliciesServlet</servlet-name>
   	</filter-mapping>	
-  	<filter-mapping>
-    	<filter-name>AuthorizationFilter</filter-name>
-		<servlet-name>ApiKeyController</servlet-name>
-  	</filter-mapping>	
   	 <filter-mapping>
     	<filter-name>AuthorizationFilter</filter-name>
 		<servlet-name>UpdatesServlet</servlet-name>
diff --git a/wookie-server/src/test/java/org/apache/wookie/tests/functional/ApiKeyControllerTest.java b/wookie-server/src/test/java/org/apache/wookie/tests/functional/ApiKeyControllerTest.java
deleted file mode 100644
index d26b564..0000000
--- a/wookie-server/src/test/java/org/apache/wookie/tests/functional/ApiKeyControllerTest.java
+++ /dev/null
@@ -1,411 +0,0 @@
-/*
- * 
- * 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.wookie.tests.functional;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.util.Map;
-
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.methods.PutMethod;
-import org.apache.wookie.tests.helpers.Request;
-import org.jdom.Document;
-import org.jdom.Element;
-import org.jdom.JDOMException;
-import org.jdom.input.SAXBuilder;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.mortbay.util.ajax.JSON;
-
-/**
- * Functional tests for API key management
- */
-public class ApiKeyControllerTest extends AbstractControllerTest {
-
-	private static final String APIKEY_SERVICE_LOCATION_VALID = TEST_SERVER_LOCATION  + "keys";
-
-	/**
-	 * Attempt to get the list of API keys without having authenticated first
-	 * 
-	 * @throws IOException
-	 * @throws HttpException
-	 */
-	@Test
-	public void getEntriesUnauthorized() throws HttpException, IOException {
-		Request request = new Request("GET", APIKEY_SERVICE_LOCATION_VALID);
-		request.execute(false, false);
-		assertEquals(403, request.getStatusCode());
-	}
-
-	/**
-	 * Get the set of API keys using default admin credentials
-	 * 
-	 * @throws IOException
-	 * @throws HttpException
-	 */
-	@Test
-	public void getKeys() throws HttpException, IOException {
-		Request request = new Request("GET", APIKEY_SERVICE_LOCATION_VALID);
-		request.execute(true, false);
-		assertEquals(200, request.getStatusCode());
-	}
-
-	/**
-	 * Get the set of API keys in JSON using default admin credentials
-	 * 
-	 * @throws IOException
-	 * @throws HttpException
-	 */
-	@SuppressWarnings("unchecked")
-	@Test
-	public void getKeysJson() throws HttpException, IOException {
-
-		Request request = new Request("GET", APIKEY_SERVICE_LOCATION_VALID);
-		request.setAccepts("application/json");
-		request.execute(true, false);
-		assertEquals(200, request.getStatusCode());
-
-		String response = request.getResponseBodyAsString();
-		//
-		// Parse the response and check the values
-		//
-		Object[] keys = (Object[]) JSON.parse(response);
-		assertEquals("TEST", ((Map<String, String>)keys[0]).get("key"));
-
-		//
-		// Try again using ?format param overriding the accepts header
-		//
-		Request request2 = new Request("GET", APIKEY_SERVICE_LOCATION_VALID);
-		request2.setAccepts("text/xml");
-		request2.addParameter("format", "json");
-		request2.execute(true, false);
-		assertEquals(200, request2.getStatusCode());
-
-		//
-		// Parse the response and check the values
-		//
-		keys = (Object[]) JSON.parse(request2.getResponseBodyAsString());
-		assertEquals("TEST", ((Map<String, String>)keys[0]).get("key"));
-	}
-
-	/**
-	 * Add a new key
-	 * 
-	 * @throws IOException
-	 * @throws HttpException
-	 */
-	@Test
-	public void addKey() throws HttpException, IOException {
-
-		//
-		// POST a new API key
-		//
-		Request request = new Request("POST", APIKEY_SERVICE_LOCATION_VALID);
-		request.addParameter("apikey", "TEST_KEY");
-		request.addParameter("email", "test@incubator.apache.org");
-		request.execute(true, false);
-		int code = request.getStatusCode();
-		assertEquals(201, code);
-
-		//
-		// Test that the set of API keys includes the one we just POSTed
-		//
-		request = new Request("GET", APIKEY_SERVICE_LOCATION_VALID);
-		request.execute(true, false);
-		code = request.getStatusCode();
-		assertEquals(200, code);
-		assertTrue(request.getResponseBodyAsString().contains("TEST_KEY"));
-
-		//
-		// Remove the key
-		// 
-		request = new Request("DELETE", APIKEY_SERVICE_LOCATION_VALID+"/"+"TEST_KEY");
-		request.execute(true, false);
-		code = request.getStatusCode();
-		assertEquals(200, code);
-	}
-
-	/**
-	 * Remove a key
-	 * 
-	 * @throws IOException
-	 * @throws JDOMException
-	 */
-	@Test
-	public void removeKey() throws JDOMException, IOException {
-		String id = null;
-
-		//
-		// Create a new API key
-		//
-		Request request = new Request("POST", APIKEY_SERVICE_LOCATION_VALID);
-		request.addParameter("apikey", "TEST_KEY_TO_REMOVE");
-		request.addParameter("email", "test@incubator.apache.org");
-		request.execute(true, false);
-		int code = request.getStatusCode();
-		assertEquals(201, code);
-
-		request = new Request("GET", APIKEY_SERVICE_LOCATION_VALID);
-		request.execute(true, false);
-		code = request.getStatusCode();
-		assertEquals(200, code);
-		assertTrue(request.getResponseBodyAsString().contains("TEST_KEY_TO_REMOVE"));
-
-		//
-		// Get the ID of the key we created
-		//
-		Document doc = new SAXBuilder().build(request.getResponseBodyAsStream());
-		for (Object key : doc.getRootElement().getChildren()) {
-			Element keyElement = (Element) key;
-			if (keyElement.getText().equals("TEST_KEY_TO_REMOVE")) {
-				id = keyElement.getText();
-			}
-		}
-
-		//
-		// Delete the API key
-		//
-		request = new Request("DELETE", APIKEY_SERVICE_LOCATION_VALID+"/"+id);
-		request.execute(true, false);
-		code = request.getStatusCode();
-		assertEquals(200, code);
-
-		//
-		// Check that the key was deleted
-		//
-		request = new Request("GET", APIKEY_SERVICE_LOCATION_VALID);
-		request.execute(true, false);
-		code = request.getStatusCode();
-		assertEquals(200, code);
-		assertFalse(request.getResponseBodyAsString().contains("TEST_KEY_TO_REMOVE"));
-
-	}
-
-	/**
-	 * Try to remove a non-existant API key
-	 * 
-	 * @throws HttpException
-	 * @throws IOException
-	 */
-	@Test
-	public void removeNonExistantEntry() throws HttpException, IOException {
-		Request request = new Request("DELETE", APIKEY_SERVICE_LOCATION_VALID+"/99999999");
-		request.execute(true, false);
-		int code = request.getStatusCode();
-		assertEquals(404, code);
-	}
-
-	/**
-	 * Create an API key with missing parameters
-	 * 
-	 * @throws IOException
-	 * @throws HttpException
-	 */
-	@Test
-	public void addEntryNoEmailOrValue() throws HttpException, IOException {  
-		Request request = new Request("POST", APIKEY_SERVICE_LOCATION_VALID);
-		request.execute(true, false);
-		int code = request.getStatusCode();
-		assertEquals(400, code);
-	}
-
-	/**
-	 * Try to create a new API key that duplicates an existing one
-	 * 
-	 * @throws IOException
-	 * @throws HttpException
-	 * @throws JDOMException 
-	 */
-	@Test
-	public void addDuplicateEntry() throws HttpException, IOException, JDOMException {
-
-		//
-		// Create an API key
-		//
-		Request request = new Request("POST", APIKEY_SERVICE_LOCATION_VALID);
-		request.addParameter("apikey", "DUPLICATION_TEST");
-		request.addParameter("email", "test@127.0.0.1");
-		request.execute(true, false);
-		int code = request.getStatusCode();
-		assertEquals(201, code);
-
-		//
-		// Replay the POST
-		//
-		request.execute(true, false);
-		code = request.getStatusCode();
-		assertEquals(409, code);
-
-		String id = null;
-
-		//
-		// Clean up
-		//
-
-		request = new Request("GET",APIKEY_SERVICE_LOCATION_VALID);
-		request.execute(true, false);
-		code = request.getStatusCode();
-		assertEquals(200, code);
-		assertTrue(request.getResponseBodyAsString().contains("DUPLICATION_TEST"));
-
-		//
-		// Get the ID of the key we created
-		//
-		Document doc = new SAXBuilder().build(request.getResponseBodyAsStream());
-		for (Object key : doc.getRootElement().getChildren()) {
-			Element keyElement = (Element) key;
-			if (keyElement.getText().equals("DUPLICATION_TEST")) {
-				id = keyElement.getText();
-			}
-		}
-
-		//
-		// Delete the API key
-		//
-		request = new Request("DELETE",APIKEY_SERVICE_LOCATION_VALID+"/"+id);
-		request.execute(true, false);
-		code = request.getStatusCode();
-		assertEquals(200, code);    
-
-		//
-		// Check that the key was deleted
-		//
-		request = new Request("GET",APIKEY_SERVICE_LOCATION_VALID);
-		request.execute(true, false);
-		code = request.getStatusCode();
-		assertEquals(200, code);
-		assertFalse(request.getResponseBodyAsString().contains("DUPLICATION_TEST"));
-	}
-
-	/**
-	 * Complex test for migrating an API key. This test is disabled as there are
-	 * issues implementing this functionality - for now, migration has been
-	 * disabled in the REST API.
-	 * 
-	 * @throws IOException
-	 * @throws HttpException
-	 * @throws JDOMException
-	 */
-	@Test
-	@Ignore
-	public void migrateAPIKey() throws HttpException, IOException, JDOMException {
-
-		String keyId = null;
-
-		//
-		// Create a new key
-		//
-		HttpClient client = new HttpClient();
-		PostMethod post = new PostMethod(APIKEY_SERVICE_LOCATION_VALID);
-		setAuthenticationCredentials(client);
-		post.setParameter("apikey", "MIGRATION_TEST_KEY_1");
-		post.setParameter("email", "test@incubator.apache.org");
-		client.executeMethod(post);
-		int code = post.getStatusCode();
-		assertEquals(201, code);
-
-		//
-		// Get the ID
-		//
-		GetMethod get = new GetMethod(APIKEY_SERVICE_LOCATION_VALID);
-		setAuthenticationCredentials(client);
-		client.executeMethod(get);
-		Document doc = new SAXBuilder().build(get.getResponseBodyAsStream());
-		for (Object key : doc.getRootElement().getChildren()) {
-			Element keyElement = (Element) key;
-			if (keyElement.getAttributeValue("value").equals("MIGRATION_TEST_KEY_1")) {
-				keyId = keyElement.getAttributeValue("id");
-			}
-		}
-
-		//
-		// Create a widget instance
-		//
-		String instance_id_key = null;
-		client = new HttpClient();
-		post = new PostMethod(TEST_INSTANCES_SERVICE_URL_VALID);
-		post.setQueryString("api_key=MIGRATION_TEST_KEY_1&widgetid="
-				+ WIDGET_ID_VALID + "&userid=test&shareddatakey=migration_test");
-		client.executeMethod(post);
-		code = post.getStatusCode();
-		String response = post.getResponseBodyAsString();
-		instance_id_key = post.getResponseBodyAsString().substring(
-				response.indexOf("<identifier>") + 12,
-				response.indexOf("</identifier>"));
-		assertEquals(201, code);
-		post.releaseConnection();
-
-		//
-		// Set participant
-		//
-		client = new HttpClient();
-		post = new PostMethod(TEST_PARTICIPANTS_SERVICE_URL_VALID);
-		post.setQueryString("api_key=MIGRATION_TEST_KEY_1&widgetid="
-				+ WIDGET_ID_VALID
-				+ "&userid=test&shareddatakey=migration_test&participant_id=1&participant_display_name=bob&participant_thumbnail_url=http://www.test.org");
-		client.executeMethod(post);
-		code = post.getStatusCode();
-		assertEquals(201, code);
-		post.releaseConnection();
-
-		//
-		// Migrate key
-		//
-		client = new HttpClient();
-		PutMethod put = new PutMethod(APIKEY_SERVICE_LOCATION_VALID + "/" + keyId);
-		put.setQueryString("apikey=MIGRATION_TEST_KEY_2&email=test@127.0.0.1");
-		setAuthenticationCredentials(client);
-		client.executeMethod(put);
-		code = put.getStatusCode();
-		assertEquals(200, code);
-		put.releaseConnection();
-
-		//
-		// Get instance again using the new key - should be 200 not 201
-		//
-		client = new HttpClient();
-		post = new PostMethod(TEST_INSTANCES_SERVICE_URL_VALID);
-		post.setQueryString("api_key=MIGRATION_TEST_KEY_2&widgetid="
-				+ WIDGET_ID_VALID + "&userid=test&shareddatakey=migration_test");
-		client.executeMethod(post);
-		code = post.getStatusCode();
-		assertEquals(200, code);
-		post.releaseConnection();
-
-		//
-		// Get participant
-		//
-		client = new HttpClient();
-		get = new GetMethod(TEST_PARTICIPANTS_SERVICE_URL_VALID);
-		get.setQueryString("api_key=MIGRATION_TEST_KEY_2&id_key=" + instance_id_key);
-		client.executeMethod(get);
-		code = get.getStatusCode();
-		assertEquals(200, code);
-		response = get.getResponseBodyAsString();
-		assertTrue(response
-				.contains("<participant id=\"1\" display_name=\"bob\" thumbnail_url=\"http://www.test.org\" />"));
-		get.releaseConnection();
-
-	}
-}
