diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
index 1f8ee5e..e3c17f0 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
@@ -16,20 +16,12 @@
 package org.apache.usergrid.corepersistence;
 
 
-import java.util.Arrays;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.UUID;
-import java.util.concurrent.atomic.AtomicBoolean;
 
-import org.apache.usergrid.corepersistence.index.IndexLocationStrategyFactory;
-import org.apache.usergrid.corepersistence.index.ReIndexRequestBuilder;
-import org.apache.usergrid.persistence.*;
-import org.apache.usergrid.persistence.graph.impl.SimpleSearchByEdge;
-import org.apache.usergrid.persistence.index.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeansException;
@@ -66,11 +58,14 @@
 import org.apache.usergrid.persistence.entities.Application;
 import org.apache.usergrid.persistence.exceptions.ApplicationAlreadyExistsException;
 import org.apache.usergrid.persistence.exceptions.DuplicateUniquePropertyExistsException;
+import org.apache.usergrid.persistence.exceptions.EntityNotFoundException;
 import org.apache.usergrid.persistence.graph.Edge;
 import org.apache.usergrid.persistence.graph.GraphManager;
 import org.apache.usergrid.persistence.graph.GraphManagerFactory;
 import org.apache.usergrid.persistence.graph.SearchByEdgeType;
 import org.apache.usergrid.persistence.graph.impl.SimpleSearchByEdgeType;
+import org.apache.usergrid.persistence.index.EntityIndex;
+import org.apache.usergrid.persistence.index.IndexRefreshCommand;
 import org.apache.usergrid.persistence.model.entity.Id;
 import org.apache.usergrid.persistence.model.entity.SimpleId;
 import org.apache.usergrid.persistence.model.util.UUIDGenerator;
@@ -364,39 +359,45 @@
         final ApplicationScope deleteApplicationScope = new ApplicationScopeImpl(deleteApplicationId);
 
         Entity oldAppEntity = managementEm.get(new SimpleEntityRef( deleteTypeName, applicationUUID));
-        Observable copyConnections = Observable.empty();
-        if (oldAppEntity != null) {
-            // ensure that there is not already a deleted app with the same name
 
-            final EntityRef alias = managementEm.getAlias( createCollectionName, oldAppEntity.getName());
-            if (alias != null) {
-                throw new ConflictException("Cannot delete app with same name as already deleted app");
-            }
-            // make a copy of the app to delete application_info entity
-            // and put it in a deleted_application_info collection
-
-            final Entity newAppEntity = managementEm.create(new SimpleId(applicationUUID, createTypeName ), oldAppEntity.getProperties());
-
-            // copy its connections too
-
-            final Set<String> connectionTypes = managementEm.getConnectionTypes(oldAppEntity);
-            copyConnections = Observable.from(connectionTypes).doOnNext(connType -> {
-                try {
-                    final Results connResults =
-                        managementEm.getTargetEntities(oldAppEntity, connType, null, Query.Level.ALL_PROPERTIES);
-                    connResults.getEntities().forEach(entity -> {
-                        try {
-                            managementEm.createConnection(newAppEntity, connType, entity);
-                        } catch (Exception e) {
-                            throw new RuntimeException(e);
-                        }
-                    });
-                } catch (Exception e) {
-                    throw new RuntimeException(e);
-                }
-            });
-
+        if(oldAppEntity == null){
+            throw new EntityNotFoundException( String.format("Could not find application with UUID '%s'", applicationUUID) );
         }
+
+
+        // ensure that there is not already a deleted app with the same name
+
+        final EntityRef alias = managementEm.getAlias( createCollectionName, oldAppEntity.getName() );
+        if ( alias != null ) {
+            throw new ConflictException( "Cannot delete app with same name as already deleted app" );
+        }
+        // make a copy of the app to delete application_info entity
+        // and put it in a deleted_application_info collection
+
+        final Entity newAppEntity =
+            managementEm.create( new SimpleId( applicationUUID, createTypeName ), oldAppEntity.getProperties() );
+
+        // copy its connections too
+
+        final Set<String> connectionTypes = managementEm.getConnectionTypes( oldAppEntity );
+        Observable copyConnections = Observable.from( connectionTypes ).doOnNext( connType -> {
+            try {
+                final Results connResults =
+                    managementEm.getTargetEntities( oldAppEntity, connType, null, Query.Level.ALL_PROPERTIES );
+                connResults.getEntities().forEach( entity -> {
+                    try {
+                        managementEm.createConnection( newAppEntity, connType, entity );
+                    }
+                    catch ( Exception e ) {
+                        throw new RuntimeException( e );
+                    }
+                } );
+            }
+            catch ( Exception e ) {
+                throw new RuntimeException( e );
+            }
+        } );
+
         final Id managementAppId = CpNamingUtils.getManagementApplicationId();
         final EntityIndex aei = getManagementIndex();
         final GraphManager managementGraphManager = managerCache.getGraphManager(managementAppScope);
diff --git a/stack/rest/src/main/java/org/apache/usergrid/rest/applications/ApplicationResource.java b/stack/rest/src/main/java/org/apache/usergrid/rest/applications/ApplicationResource.java
index a35532d..bf350bc 100644
--- a/stack/rest/src/main/java/org/apache/usergrid/rest/applications/ApplicationResource.java
+++ b/stack/rest/src/main/java/org/apache/usergrid/rest/applications/ApplicationResource.java
@@ -20,23 +20,36 @@
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.util.Map;
-import java.util.Properties;
 import java.util.UUID;
 
-import javax.ws.rs.*;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.PathSegment;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
-import org.apache.commons.lang.StringUtils;
-import org.apache.usergrid.rest.ApiResponse;
-import org.apache.usergrid.rest.security.annotations.RequireOrganizationAccess;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
+
+import org.apache.amber.oauth2.common.error.OAuthError;
+import org.apache.amber.oauth2.common.exception.OAuthProblemException;
+import org.apache.amber.oauth2.common.message.OAuthResponse;
+import org.apache.amber.oauth2.common.message.types.GrantType;
+import org.apache.shiro.authz.UnauthorizedException;
+import org.apache.shiro.codec.Base64;
+
 import org.apache.usergrid.management.ApplicationInfo;
 import org.apache.usergrid.management.exceptions.DisabledAdminUserException;
 import org.apache.usergrid.management.exceptions.DisabledAppUserException;
@@ -44,10 +57,10 @@
 import org.apache.usergrid.management.exceptions.UnactivatedAppUserException;
 import org.apache.usergrid.mq.QueueManager;
 import org.apache.usergrid.persistence.EntityManager;
-import org.apache.usergrid.persistence.index.query.Identifier;
 import org.apache.usergrid.persistence.SimpleEntityRef;
 import org.apache.usergrid.persistence.entities.Application;
 import org.apache.usergrid.persistence.entities.User;
+import org.apache.usergrid.persistence.index.query.Identifier;
 import org.apache.usergrid.rest.AbstractContextResource;
 import org.apache.usergrid.rest.applications.assets.AssetsResource;
 import org.apache.usergrid.rest.applications.events.EventsResource;
@@ -56,16 +69,10 @@
 import org.apache.usergrid.rest.exceptions.AuthErrorInfo;
 import org.apache.usergrid.rest.exceptions.RedirectionException;
 import org.apache.usergrid.rest.security.annotations.RequireApplicationAccess;
+import org.apache.usergrid.rest.security.annotations.RequireOrganizationAccess;
 import org.apache.usergrid.security.oauth.AccessInfo;
 import org.apache.usergrid.security.oauth.ClientCredentialsInfo;
 
-import org.apache.amber.oauth2.common.error.OAuthError;
-import org.apache.amber.oauth2.common.exception.OAuthProblemException;
-import org.apache.amber.oauth2.common.message.OAuthResponse;
-import org.apache.amber.oauth2.common.message.types.GrantType;
-import org.apache.shiro.authz.UnauthorizedException;
-import org.apache.shiro.codec.Base64;
-
 import com.sun.jersey.api.json.JSONWithPadding;
 import com.sun.jersey.api.view.Viewable;
 
@@ -488,66 +495,12 @@
     }
 
 
-    /**
-     * Put on application URL will restore application if it was deleted.
-     */
-    @PUT
-    @RequireOrganizationAccess
     @Override
-    public JSONWithPadding executePut(  @Context UriInfo ui, String body,
-        @QueryParam("callback") @DefaultValue("callback") String callback ) throws Exception {
-
-        if ( applicationId == null ) {
-            throw new IllegalArgumentException("Application ID not specified in request");
-        }
-
-        management.restoreApplication( applicationId );
-
-        ApiResponse response = createApiResponse();
-        response.setAction( "restore" );
-        response.setApplication( services.getApplication() );
-        response.setParams( ui.getQueryParameters() );
-
-        return new JSONWithPadding( response, callback );
-    }
-
-
     @DELETE
     @RequireOrganizationAccess
-    @Override
-    public JSONWithPadding executeDelete(  @Context UriInfo ui,
-        @QueryParam("callback") @DefaultValue("callback") String callback,
-        @QueryParam("app_delete_confirm") String confirmDelete) throws Exception {
-
-        if (!"confirm_delete_of_application_and_data".equals( confirmDelete ) ) {
-            throw new IllegalArgumentException(
-                "Cannot delete application without app_delete_confirm parameter");
-        }
-
-        Properties props = management.getProperties();
-
-        // for now, only works in test mode
-        String testProp = ( String ) props.get( "usergrid.test" );
-        if ( testProp == null || !Boolean.parseBoolean( testProp ) ) {
-            throw new UnsupportedOperationException();
-        }
-
-        if ( applicationId == null ) {
-            throw new IllegalArgumentException("Application ID not specified in request");
-        }
-
-        management.deleteApplication( applicationId );
-
-        LOG.debug( "ApplicationResource.delete() deleted appId = {}", applicationId);
-
-        ApiResponse response = createApiResponse();
-        response.setAction( "delete" );
-        response.setApplication(services.getApplication());
-        response.setParams(ui.getQueryParameters());
-
-        LOG.debug( "ApplicationResource.delete() sending response ");
-
-        return new JSONWithPadding( response, callback );
+    public JSONWithPadding executeDelete( @Context final UriInfo ui, @DefaultValue( "callback" ) final String callback,
+                                          final String confirmAppDelete ) throws Exception {
+        throw new UnsupportedOperationException( "Delete must be done from the management endpoint" );
     }
 
 
diff --git a/stack/rest/src/main/java/org/apache/usergrid/rest/exceptions/OrganizationApplicationNotFoundExceptionMapper.java b/stack/rest/src/main/java/org/apache/usergrid/rest/exceptions/OrganizationApplicationNotFoundExceptionMapper.java
index 0d25021..8f4111a 100644
--- a/stack/rest/src/main/java/org/apache/usergrid/rest/exceptions/OrganizationApplicationNotFoundExceptionMapper.java
+++ b/stack/rest/src/main/java/org/apache/usergrid/rest/exceptions/OrganizationApplicationNotFoundExceptionMapper.java
@@ -27,6 +27,6 @@
         extends AbstractExceptionMapper<OrganizationApplicationNotFoundException> {
     @Override
     public Response toResponse( OrganizationApplicationNotFoundException e ) {
-        return super.toResponse( Response.Status.BAD_REQUEST, e );
+        return super.toResponse( Response.Status.NOT_FOUND, e );
     }
 }
diff --git a/stack/rest/src/main/java/org/apache/usergrid/rest/management/organizations/applications/ApplicationResource.java b/stack/rest/src/main/java/org/apache/usergrid/rest/management/organizations/applications/ApplicationResource.java
index fe11cb6..bcec775 100644
--- a/stack/rest/src/main/java/org/apache/usergrid/rest/management/organizations/applications/ApplicationResource.java
+++ b/stack/rest/src/main/java/org/apache/usergrid/rest/management/organizations/applications/ApplicationResource.java
@@ -38,6 +38,9 @@
 import org.apache.usergrid.security.providers.SignInAsProvider;
 import org.apache.usergrid.security.providers.SignInProviderFactory;
 import org.apache.usergrid.services.ServiceManager;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
@@ -49,6 +52,7 @@
 import javax.ws.rs.core.UriInfo;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Properties;
 import java.util.UUID;
 
 import static javax.servlet.http.HttpServletResponse.SC_ACCEPTED;
@@ -73,6 +77,8 @@
 })
 public class ApplicationResource extends AbstractContextResource {
 
+    private static final Logger logger = LoggerFactory.getLogger(ApplicationResource.class);
+
     @Autowired
     protected ExportService exportService;
 
@@ -103,20 +109,6 @@
     }
 
 
-    @RequireOrganizationAccess
-    @DELETE
-    public JSONWithPadding deleteApplicationFromOrganizationByApplicationId(
-            @Context UriInfo ui, @QueryParam("callback") @DefaultValue("callback") String callback )
-        throws Exception {
-
-        ApiResponse response = createApiResponse();
-        response.setAction( "delete application from organization" );
-
-        management.deleteOrganizationApplication( organization.getUuid(), applicationId );
-
-        return new JSONWithPadding( response, callback );
-    }
-
 
     @RequireOrganizationAccess
     @GET
@@ -393,4 +385,67 @@
 
         return Response.status( SC_OK ).entity( null ).build();
     }
+
+
+
+    /**
+     * Put on application URL will restore application if it was deleted.
+     */
+    @PUT
+    @RequireOrganizationAccess
+    public JSONWithPadding executePut(  @Context UriInfo ui, String body,
+        @QueryParam("callback") @DefaultValue("callback") String callback ) throws Exception {
+
+        if ( applicationId == null ) {
+            throw new IllegalArgumentException("Application ID not specified in request");
+        }
+
+        management.restoreApplication( applicationId );
+
+        ApiResponse response = createApiResponse();
+        response.setAction( "restore" );
+        response.setApplication( emf.getEntityManager( applicationId ).getApplication() );
+        response.setParams( ui.getQueryParameters() );
+
+        return new JSONWithPadding( response, callback );
+    }
+
+
+    @DELETE
+    @RequireOrganizationAccess
+    public JSONWithPadding executeDelete(  @Context UriInfo ui,
+        @QueryParam("callback") @DefaultValue("callback") String callback,
+        @QueryParam("app_delete_confirm") String confirmDelete) throws Exception {
+
+        if (!"confirm_delete_of_application_and_data".equals( confirmDelete ) ) {
+            throw new IllegalArgumentException(
+                "Cannot delete application without app_delete_confirm parameter");
+        }
+
+        Properties props = management.getProperties();
+
+        // for now, only works in test mode
+        String testProp = ( String ) props.get( "usergrid.test" );
+        if ( testProp == null || !Boolean.parseBoolean( testProp ) ) {
+            throw new UnsupportedOperationException();
+        }
+
+        if ( applicationId == null ) {
+            throw new IllegalArgumentException("Application ID not specified in request");
+        }
+
+        management.deleteApplication( applicationId );
+
+        logger.debug( "ApplicationResource.delete() deleted appId = {}", applicationId);
+
+        ApiResponse response = createApiResponse();
+        response.setAction( "delete" );
+        response.setApplication(emf.getEntityManager( applicationId ).getApplication());
+        response.setParams(ui.getQueryParameters());
+
+        logger.debug( "ApplicationResource.delete() sending response ");
+
+        return new JSONWithPadding( response, callback );
+    }
+
 }
diff --git a/stack/rest/src/main/java/org/apache/usergrid/rest/management/organizations/applications/ApplicationsResource.java b/stack/rest/src/main/java/org/apache/usergrid/rest/management/organizations/applications/ApplicationsResource.java
index f8e2268..28eff4e 100644
--- a/stack/rest/src/main/java/org/apache/usergrid/rest/management/organizations/applications/ApplicationsResource.java
+++ b/stack/rest/src/main/java/org/apache/usergrid/rest/management/organizations/applications/ApplicationsResource.java
@@ -135,19 +135,6 @@
 
 
     @RequireOrganizationAccess
-    @Path(RootResource.APPLICATION_ID_PATH)
-    @PUT
-    public ApplicationResource restoreApplicationFromOrganizationByApplicationId(
-        @Context UriInfo ui,
-        @PathParam( "applicationId" )
-        String applicationIdStr ) throws Exception {
-
-        return getSubResource( ApplicationResource.class )
-            .init( organization, UUID.fromString( applicationIdStr ) );
-    }
-
-
-    @RequireOrganizationAccess
     @Path( "{applicationName}" )
     public ApplicationResource applicationFromOrganizationByApplicationName(
         @Context UriInfo ui, @PathParam( "applicationName" ) String applicationName ) throws Exception {
diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationCreateIT.java b/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationCreateIT.java
index 921027f..7ec562d 100644
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationCreateIT.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationCreateIT.java
@@ -56,9 +56,9 @@
         applicationMap.put( "name", appName );
 
         this.management().token().setToken(orgAdminToken);
-        this.management().orgs().organization( orgName ).apps().post(applicationMap );
+        this.management().orgs().org( orgName ).apps().post(applicationMap );
 
-        Entity response = this.management().orgs().organization( orgName ).addToPath( "apps" ).addToPath( appName ).get();
+        Entity response = this.management().orgs().org( orgName ).addToPath( "apps" ).addToPath( appName ).get();
 
         assertNotNull( response );
     }
@@ -84,7 +84,7 @@
         // test that we get all applications back from the management end-point
 
         ManagementResponse orgAppResponse = clientSetup.getRestClient()
-            .management().orgs().organization( orgName ).apps().getOrganizationApplications();
+            .management().orgs().org( orgName ).apps().getOrganizationApplications();
 
         int count = 0;
         for ( String name : orgAppResponse.getData().keySet() ) {
@@ -100,7 +100,7 @@
         String orgName, String appName, Token orgAdminToken, List<Entity> entities) {
 
         ApiResponse appCreateResponse = clientSetup.getRestClient()
-            .management().orgs().organization( orgName ).app().post( new Application( appName ) );
+            .management().orgs().org( orgName ).app().post( new Application( appName ) );
         UUID appId = appCreateResponse.getEntities().get(0).getUuid();
 
         refreshIndex();
diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationDeleteIT.java b/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationDeleteIT.java
index a70fee1..d00ae74 100644
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationDeleteIT.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationDeleteIT.java
@@ -18,39 +18,37 @@
 package org.apache.usergrid.rest.applications;
 
 
-import com.fasterxml.jackson.databind.JsonNode;
-import com.sun.jersey.api.client.UniformInterfaceException;
-import org.apache.usergrid.rest.test.resource2point0.AbstractRestIT;
-import org.apache.usergrid.rest.test.resource2point0.endpoints.mgmt.ManagementResponse;
-import org.apache.usergrid.rest.test.resource2point0.model.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.UUID;
+
+import javax.ws.rs.core.MediaType;
+
 import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import net.jcip.annotations.NotThreadSafe;
 
-import javax.ws.rs.core.MediaType;
-import java.util.*;
+import org.apache.usergrid.rest.test.resource2point0.AbstractRestIT;
+import org.apache.usergrid.rest.test.resource2point0.endpoints.mgmt.ManagementResponse;
+import org.apache.usergrid.rest.test.resource2point0.model.ApiResponse;
+import org.apache.usergrid.rest.test.resource2point0.model.Application;
+import org.apache.usergrid.rest.test.resource2point0.model.Entity;
+import org.apache.usergrid.rest.test.resource2point0.model.Token;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.sun.jersey.api.client.UniformInterfaceException;
 
 import static org.junit.Assert.fail;
 
-@NotThreadSafe
+
 public class ApplicationDeleteIT extends AbstractRestIT {
 
     private static final Logger logger = LoggerFactory.getLogger(ApplicationDeleteIT.class);
 
     public static final int INDEXING_WAIT = 3000;
 
-    Token orgAdminToken;
-    String orgName;
-    @Before
-    public void setup(){
-        orgAdminToken = getAdminToken( clientSetup.getUsername(), clientSetup.getUsername());
-        orgName = clientSetup.getOrganization().getName();
-
-    }
 
     /**
      * Test most common use cases.
@@ -67,27 +65,32 @@
 
         // create app with a collection of "things"
 
+        String orgName = clientSetup.getOrganization().getName();
+        String appToDeleteName = clientSetup.getAppName() + "_appToDelete";
+        Token orgAdminToken = getAdminToken( clientSetup.getUsername(), clientSetup.getUsername());
+
         List<Entity> entities = new ArrayList<>();
 
-        String         appToDeleteName = clientSetup.getAppName() + UUID.randomUUID();
         UUID appToDeleteId = createAppWithCollection(orgName, appToDeleteName, orgAdminToken, entities);
 
         // delete the app
 
         try {
-            clientSetup.getRestClient()
-                .org(orgName).app(appToDeleteId.toString()).getResource()
+            clientSetup.getRestClient() .management().orgs()
+                .org(orgName).apps().app(appToDeleteId.toString()).getResource()
                 .queryParam("access_token", orgAdminToken.getAccessToken())
                 .delete();
 
             fail("Delete must fail without app_delete_confirm parameter");
 
-        } catch ( Exception e ) {
-            logger.error("Error", e);
+        } catch (  UniformInterfaceException expected  ) {
+            Assert.assertEquals("Error must be 400", 400, expected.getResponse().getStatus() );
+            JsonNode node = mapper.readTree( expected.getResponse().getEntity( String.class ));
+            Assert.assertEquals("Cannot delete application without app_delete_confirm parameter", node.get("error_description").textValue());
         }
 
-        clientSetup.getRestClient()
-            .org(orgName).app(appToDeleteId.toString() ).getResource()
+        clientSetup.getRestClient().management().orgs()
+            .org(orgName).apps().app(appToDeleteId.toString() ).getResource()
             .queryParam("access_token", orgAdminToken.getAccessToken() )
             .queryParam("app_delete_confirm", "confirm_delete_of_application_and_data")
             .delete();
@@ -95,8 +98,8 @@
         // test that we can no longer get the app
 
         try {
-            clientSetup.getRestClient()
-                .org(orgName).app(appToDeleteName).getResource()
+            clientSetup.getRestClient().management().orgs()
+                .org(orgName).apps().app(appToDeleteName).getResource()
                 .queryParam("access_token", orgAdminToken.getAccessToken())
                 .type(MediaType.APPLICATION_JSON)
                 .get(ApiResponse.class);
@@ -104,11 +107,26 @@
             fail("Must not be able to get deleted app");
 
         } catch ( UniformInterfaceException expected ) {
-            Assert.assertEquals("Error must be 400", 400, expected.getResponse().getStatus() );
+            Assert.assertEquals("Error must be 404", 404, expected.getResponse().getStatus() );
             JsonNode node = mapper.readTree( expected.getResponse().getEntity( String.class ));
-            Assert.assertEquals("organization_application_not_found", node.get("error").textValue());
+            Assert.assertEquals("entity_not_found", node.get("error").textValue());
         }
 
+
+        try {
+            clientSetup.getRestClient().org( orgName ).app( appToDeleteName ).getResource()
+                       .queryParam( "access_token", orgAdminToken.getAccessToken() ).type( MediaType.APPLICATION_JSON )
+                       .get( ApiResponse.class );
+
+            fail( "Must not be able to get deleted app" );
+        }
+        catch ( UniformInterfaceException expected ) {
+            Assert.assertEquals( "Error must be 404", 404, expected.getResponse().getStatus() );
+            JsonNode node = mapper.readTree( expected.getResponse().getEntity( String.class ) );
+            Assert.assertEquals( "organization_application_not_found", node.get( "error" ).textValue() );
+        }
+
+
         // test that we can no longer get deleted app's collection
 
         try {
@@ -121,7 +139,7 @@
             fail("Must not be able to get deleted app's collection");
 
         } catch ( UniformInterfaceException expected ) {
-            Assert.assertEquals("Error must be 400", 400, expected.getResponse().getStatus() );
+            Assert.assertEquals("Error must be 400", 404, expected.getResponse().getStatus() );
             JsonNode node = mapper.readTree( expected.getResponse().getEntity( String.class ));
             Assert.assertEquals("organization_application_not_found", node.get("error").textValue());
         }
@@ -140,7 +158,7 @@
 
         } catch ( UniformInterfaceException expected ) {
             // TODO: why not a 404?
-            Assert.assertEquals("Error must be 400", 400, expected.getResponse().getStatus() );
+            Assert.assertEquals("Error must be 400", 404, expected.getResponse().getStatus() );
             JsonNode node = mapper.readTree( expected.getResponse().getEntity( String.class ));
             Assert.assertEquals("organization_application_not_found", node.get("error").textValue());
         }
@@ -151,7 +169,7 @@
         refreshIndex();
 
         ManagementResponse orgAppResponse = clientSetup.getRestClient()
-            .management().orgs().organization( orgName ).apps().getOrganizationApplications();
+            .management().orgs().org( orgName ).apps().getOrganizationApplications();
 
         for ( String appName : orgAppResponse.getData().keySet() ) {
             if ( orgAppResponse.getData().get( appName ).equals( appToDeleteId.toString() )) {
@@ -162,21 +180,22 @@
         // test that we cannot delete the application a second time
 
         try {
-            clientSetup.getRestClient()
-                .org(orgName).app(appToDeleteId.toString()).getResource()
-                .queryParam("access_token", orgAdminToken.getAccessToken())
-                .delete();
+            clientSetup.getRestClient().management().orgs().org( orgName ).apps().app( appToDeleteId.toString() )
+                       .getResource().queryParam( "access_token", orgAdminToken.getAccessToken() )
+                       .queryParam( "app_delete_confirm", "confirm_delete_of_application_and_data" ).delete();
 
-        } catch ( UniformInterfaceException expected ) {
-            Assert.assertEquals("Error must be 404", 404, expected.getResponse().getStatus() );
-            JsonNode node = mapper.readTree( expected.getResponse().getEntity( String.class ));
-            Assert.assertEquals("not_found", node.get("error").textValue());
+            fail("Can't delete a non existent app twice");
+        }
+        catch ( UniformInterfaceException expected ) {
+            Assert.assertEquals( "Error must be 404", 404, expected.getResponse().getStatus() );
+            JsonNode node = mapper.readTree( expected.getResponse().getEntity( String.class ) );
+            Assert.assertEquals( "entity_not_found", node.get( "error" ).textValue() );
         }
 
         // test that we can create a new application with the same name
 
         ApiResponse appCreateAgainResponse = clientSetup.getRestClient()
-            .management().orgs().organization( orgName ).app().getResource()
+            .management().orgs().org( orgName ).app().getResource()
             .queryParam( "access_token", orgAdminToken.getAccessToken() )
             .type( MediaType.APPLICATION_JSON )
             .post( ApiResponse.class, new Application( appToDeleteName ) );
@@ -198,9 +217,13 @@
      */
     @Test
     public void testAppRestore() throws Exception {
-        String         appToDeleteName = clientSetup.getAppName() + UUID.randomUUID();
 
         // create app with a collection of "things"
+
+        String orgName = clientSetup.getOrganization().getName();
+        String appToDeleteName = clientSetup.getAppName() + "_appToDelete";
+        Token orgAdminToken = getAdminToken( clientSetup.getUsername(), clientSetup.getUsername());
+
         List<Entity> entities = new ArrayList<>();
 
         UUID appToDeleteId = createAppWithCollection(orgName, appToDeleteName, orgAdminToken, entities);
@@ -209,8 +232,8 @@
 
         logger.debug("\n\nDeleting app\n");
 
-        clientSetup.getRestClient()
-            .org(orgName).app( appToDeleteName ).getResource()
+        clientSetup.getRestClient().management().orgs()
+            .org(orgName).apps().app( appToDeleteName ).getResource()
             .queryParam("access_token", orgAdminToken.getAccessToken() )
             .queryParam("app_delete_confirm", "confirm_delete_of_application_and_data")
             .delete();
@@ -222,8 +245,8 @@
 
         logger.debug("\n\nRestoring app\n");
 
-        clientSetup.getRestClient()
-            .org(orgName).app( appToDeleteId.toString() ).getResource()
+        clientSetup.getRestClient().management().orgs()
+            .org(orgName).apps().app( appToDeleteId.toString() ).getResource()
             .queryParam("access_token", orgAdminToken.getAccessToken() )
             .put();
 
@@ -234,7 +257,7 @@
         logger.debug("\n\nGetting app list from management end-point\n");
 
         ManagementResponse orgAppResponse = clientSetup.getRestClient()
-            .management().orgs().organization( orgName ).apps().getOrganizationApplications();
+            .management().orgs().org( orgName ).apps().getOrganizationApplications();
 
         boolean found = false;
         for ( String appName : orgAppResponse.getData().keySet() ) {
@@ -274,21 +297,24 @@
      */
     @Test
     public void testAppRestoreConflict() throws Exception {
-        String         appToDeleteName = clientSetup.getAppName() + UUID.randomUUID();
 
         // create app with a collection of "things"
+
+        String orgName = clientSetup.getOrganization().getName();
+        String appToDeleteName = clientSetup.getAppName() + "_appToDelete";
+        Token orgAdminToken = getAdminToken( clientSetup.getUsername(), clientSetup.getUsername());
+
         List<Entity> entities = new ArrayList<>();
 
         UUID appToDeleteId = createAppWithCollection(orgName, appToDeleteName, orgAdminToken, entities);
 
         // delete the app
 
-        clientSetup.getRestClient()
-            .org( orgName ).app(appToDeleteId.toString() ).getResource()
+        clientSetup.getRestClient().management().orgs()
+            .org( orgName ).apps().app(appToDeleteId.toString() ).getResource()
             .queryParam( "access_token", orgAdminToken.getAccessToken() )
             .queryParam("app_delete_confirm", "confirm_delete_of_application_and_data")
             .delete();
-        refreshIndex();
 
         // create new app with same name
 
@@ -298,8 +324,8 @@
 
         try {
 
-            clientSetup.getRestClient()
-                .org(orgName).app(appToDeleteId.toString()).getResource()
+            clientSetup.getRestClient() .management().orgs()
+                .org(orgName).apps().app(appToDeleteId.toString()).getResource()
                 .queryParam("access_token", orgAdminToken.getAccessToken())
                 .put();
 
@@ -317,11 +343,11 @@
      */
     @Test
     public void testAppDeleteConflict() throws Exception {
-        String         appToDeleteName = clientSetup.getAppName() + UUID.randomUUID();
 
         // create app with a collection of "things"
 
         String orgName = clientSetup.getOrganization().getName();
+        String appToDeleteName = clientSetup.getAppName() + "_appToDelete";
         Token orgAdminToken = getAdminToken( clientSetup.getUsername(), clientSetup.getUsername());
 
         List<Entity> entities = new ArrayList<>();
@@ -330,12 +356,11 @@
 
         // delete the app
 
-        clientSetup.getRestClient()
-            .org( orgName ).app(appToDeleteId.toString() ).getResource()
+        clientSetup.getRestClient().management().orgs().org( orgName ).apps().app( appToDeleteId.toString() ).getResource()
             .queryParam( "access_token", orgAdminToken.getAccessToken() )
-            .queryParam("app_delete_confirm", "confirm_delete_of_application_and_data")
+            .queryParam( "app_delete_confirm", "confirm_delete_of_application_and_data" )
             .delete();
-        refreshIndex();
+
         // create new app with same name
 
         UUID newAppId = createAppWithCollection(orgName, appToDeleteName, orgAdminToken, entities);
@@ -344,8 +369,7 @@
 
         try {
 
-            clientSetup.getRestClient()
-                .org(orgName).app( newAppId.toString() ).getResource()
+            clientSetup.getRestClient().management().orgs().org( orgName ).apps().app( newAppId.toString() ).getResource()
                 .queryParam("access_token", orgAdminToken.getAccessToken())
                 .queryParam("app_delete_confirm", "confirm_delete_of_application_and_data")
                 .delete();
@@ -362,7 +386,7 @@
         String orgName, String appName, Token orgAdminToken, List<Entity> entities) {
 
         ApiResponse appCreateResponse = clientSetup.getRestClient()
-            .management().orgs().organization( orgName ).app().getResource()
+            .management().orgs().org( orgName ).app().getResource()
             .queryParam( "access_token", orgAdminToken.getAccessToken() )
             .type( MediaType.APPLICATION_JSON )
             .post( ApiResponse.class, new Application( appName ) );
@@ -386,7 +410,6 @@
 
             entities.add( createResponse.getEntities().get(0) );
         }
-        refreshIndex();
         return appId;
     }
 }
diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationResourceIT.java b/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationResourceIT.java
index 4ce3396..d4a3e06 100644
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationResourceIT.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationResourceIT.java
@@ -130,7 +130,7 @@
 
         //Create the organization resource
         OrganizationResource orgResource = clientSetup.getRestClient()
-            .management().orgs().organization(clientSetup.getOrganizationName());
+            .management().orgs().org( clientSetup.getOrganizationName() );
 
         //retrieve the credentials
         Credentials orgCredentials = new Credentials( orgResource.credentials().get(ApiResponse.class));
@@ -442,13 +442,13 @@
         assertNotNull(entity);
         refreshIndex();
         //Retrieve an authentication token for the user
-        Token tokenResponse = this.app().getResource(false).path(String.format("/%s/%s/token", orgName, appName))
+        Token tokenResponse = this.app().getResource(false).path("token")
             .queryParam("grant_type", "password")
             .queryParam("username", username)
             .queryParam("password", "password")
-            .accept(MediaType.APPLICATION_JSON)
-            .type(MediaType.APPLICATION_JSON_TYPE)
-            .get(Token.class);
+            .accept( MediaType.APPLICATION_JSON )
+            .type( MediaType.APPLICATION_JSON_TYPE )
+            .get( Token.class );
 
         String token = tokenResponse.getAccessToken();
         assertNotNull(token);
@@ -756,7 +756,7 @@
      */
     public Credentials getOrgCredentials() throws IOException {
         String orgName = clientSetup.getOrganizationName().toLowerCase();
-        return new Credentials( clientSetup.getRestClient().management().orgs().organization(orgName).credentials().get(ApiResponse.class,null,true) );
+        return new Credentials( clientSetup.getRestClient().management().orgs().org( orgName ).credentials().get(ApiResponse.class,null,true) );
 
     }
 }
diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/management/AdminUsersIT.java b/stack/rest/src/test/java/org/apache/usergrid/rest/management/AdminUsersIT.java
index 9306f2b..1277ae2 100644
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/management/AdminUsersIT.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/management/AdminUsersIT.java
@@ -495,7 +495,7 @@
 
         orgPropertiesPayload.put("properties", props);
 
-        management().orgs().organization( clientSetup.getOrganizationName() ).put( orgPropertiesPayload );
+        management().orgs().org( clientSetup.getOrganizationName() ).put( orgPropertiesPayload );
 
         //Creates a payload with the same password to verify we cannot change the password to itself.
          Map<String, Object> payload = new HashMap<>(  );
@@ -615,12 +615,12 @@
 //        management().token().setToken( organizationToken );
 
         //Create admin user
-        management().orgs().organization( clientSetup.getOrganizationName() ).users().post(ApiResponse.class ,adminUserPayload );
+        management().orgs().org( clientSetup.getOrganizationName() ).users().post(ApiResponse.class ,adminUserPayload );
 
         refreshIndex();
 
         //Retrieves the admin users
-        ApiResponse adminUsers = management().orgs().organization( clientSetup.getOrganizationName() ).users().get(ApiResponse.class);
+        ApiResponse adminUsers = management().orgs().org( clientSetup.getOrganizationName() ).users().get(ApiResponse.class);
 
         assertEquals("There need to be 2 admin users",2,( ( ArrayList ) adminUsers.getData() ).size());
 
diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/management/ExportResourceIT.java b/stack/rest/src/test/java/org/apache/usergrid/rest/management/ExportResourceIT.java
index 8ed6777..0874fc7 100644
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/management/ExportResourceIT.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/management/ExportResourceIT.java
@@ -53,7 +53,7 @@
     public void exportApplicationUUIDRetTest() throws Exception {
 
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .app().addToPath( clientSetup.getAppUuid() ).addToPath( "export" );
         }
         catch ( UniformInterfaceException uie ) {
@@ -72,7 +72,7 @@
         try {
 
 
-            exportEntity = management().orgs().organization( clientSetup.getOrganizationName() )
+            exportEntity = management().orgs().org( clientSetup.getOrganizationName() )
                         .app().addToPath( clientSetup.getAppUuid()).addToPath( "collection" )
                         .addToPath( "users" ).addToPath( "export" ).post(ApiResponse.class,payloadBuilder() );
         }
@@ -97,7 +97,7 @@
 
 
         try {
-            exportEntity = management().orgs().organization( clientSetup.getOrganizationName() )
+            exportEntity = management().orgs().org( clientSetup.getOrganizationName() )
                                        .addToPath( "export" ).post( ApiResponse.class, payloadBuilder() );
         }
         catch ( UniformInterfaceException uie ) {
@@ -111,7 +111,7 @@
         exportEntity = null;
         try {
 
-            exportEntity = management().orgs().organization( clientSetup.getOrganizationName() )
+            exportEntity = management().orgs().org( clientSetup.getOrganizationName() )
                                        .addToPath( "export" ).addToPath( uuid ).get( ApiResponse.class );
         }
         catch ( UniformInterfaceException uie ) {
@@ -139,7 +139,7 @@
 
 
         try {
-            exportEntity = management().orgs().organization( clientSetup.getOrganizationName() )
+            exportEntity = management().orgs().org( clientSetup.getOrganizationName() )
                                        .app().addToPath( clientSetup.getAppUuid() )
                                        .addToPath( "export" ).post( ApiResponse.class, payloadBuilder() );
         }
@@ -155,7 +155,7 @@
         refreshIndex();
         try {
 
-            exportEntity = management().orgs().organization( clientSetup.getOrganizationName() )
+            exportEntity = management().orgs().org( clientSetup.getOrganizationName() )
                                        .addToPath( "export" ).addToPath( uuid ).get( ApiResponse.class );
         }
         catch ( UniformInterfaceException uie ) {
@@ -174,7 +174,7 @@
 
         ApiResponse exportEntity = null;
 
-        exportEntity = management().orgs().organization( clientSetup.getOrganizationName() )
+        exportEntity = management().orgs().org( clientSetup.getOrganizationName() )
                                    .app().addToPath( clientSetup.getAppUuid()).addToPath( "collection" )
                                    .addToPath( "users" ).addToPath( "export" )
                                    .post( ApiResponse.class, payloadBuilder() );
@@ -185,7 +185,7 @@
 
         exportEntity = null;
         try {
-            exportEntity = management().orgs().organization( clientSetup.getOrganizationName() )
+            exportEntity = management().orgs().org( clientSetup.getOrganizationName() )
                                        .addToPath( "export" ).addToPath( uuid ).get( ApiResponse.class );
         }
         catch ( UniformInterfaceException uie ) {
@@ -205,7 +205,7 @@
     public void exportGetWrongUUID() throws Exception {
         UUID fake = UUID.fromString( "AAAAAAAA-FFFF-FFFF-FFFF-AAAAAAAAAAAA" );
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                                        .addToPath( "export" ).addToPath( fake.toString() ).get( ApiResponse.class );
             fail( "Should not have been able to get fake uuid" );
         }
@@ -221,7 +221,7 @@
     @Test
     public void exportPostApplicationNullPointerProperties() throws Exception {
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                                        .app().addToPath( clientSetup.getAppUuid() )
                                        .addToPath( "export" ).post( ApiResponse.class,
                 new HashMap<String, Object>() );
@@ -237,7 +237,7 @@
     @Test
     public void exportPostOrganizationNullPointerProperties() throws Exception {
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .addToPath( "export" ).post( ApiResponse.class, new HashMap<String, Object>()  );
             fail( "Should not have passed, The payload is empty." );
         }
@@ -251,7 +251,7 @@
     @Test
     public void exportPostCollectionNullPointer() throws Exception {
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .app().addToPath( clientSetup.getAppUuid() )
                         .addToPath( "collection" ).addToPath( "users" )
                         .addToPath( "export" ).post( ApiResponse.class, new HashMap<String, Object>()  );
@@ -269,7 +269,7 @@
         UUID fake = UUID.fromString( "AAAAAAAA-FFFF-FFFF-FFFF-AAAAAAAAAAAA" );
 
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .app().addToPath( clientSetup.getAppUuid() )
                         .addToPath( "collection" ).addToPath( "users" )
                         .addToPath( "export" ).addToPath( fake.toString() ).get(ApiResponse.class ,false);
@@ -286,7 +286,7 @@
         UUID fake = UUID.fromString( "AAAAAAAA-FFFF-FFFF-FFFF-AAAAAAAAAAAA" );
 
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .app().addToPath( clientSetup.getAppUuid() )
                         .addToPath( "export" ).addToPath( fake.toString() ).get(ApiResponse.class ,false);
             fail( "Should not have passed as we didn't have an access token." );
@@ -302,7 +302,7 @@
         UUID fake = UUID.fromString( "AAAAAAAA-FFFF-FFFF-FFFF-AAAAAAAAAAAA" );
 
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .addToPath( "export" ).addToPath( fake.toString() ).get(ApiResponse.class ,false);
             fail( "Should not have passed as we didn't have an access token." );
         }
@@ -320,7 +320,7 @@
         properties.remove( "storage_info" );
 
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .addToPath( "export" ).post( ApiResponse.class, payload );
             fail( "Should not have passed as we were missing an important part of the payload" );
 
@@ -340,7 +340,7 @@
         properties.remove( "storage_info" );
 
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .app().addToPath( clientSetup.getAppUuid() )
                         .addToPath( "export" ).post( ApiResponse.class,
                 payload );
@@ -361,7 +361,7 @@
         properties.remove( "storage_info" );
 
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .app().addToPath( clientSetup.getAppUuid() )
                         .addToPath( "collection" ).addToPath( "users" )
                         .addToPath( "export" ).post( ApiResponse.class,
@@ -383,7 +383,7 @@
         properties.remove( "storage_provider" );
 
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .addToPath( "export" ).post( ApiResponse.class, payload );
             fail( "Should not have passed as we were missing an important part of the payload" );
 
@@ -403,7 +403,7 @@
         properties.remove( "storage_provider" );
 
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .app().addToPath( clientSetup.getAppUuid() )
                         .addToPath( "export" ).post( ApiResponse.class,
                 payload );
@@ -424,7 +424,7 @@
         properties.remove( "storage_provider" );
 
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .app().addToPath( clientSetup.getAppUuid() )
                         .addToPath( "collection" ).addToPath( "users" )
                         .addToPath( "export" ).post( ApiResponse.class,
@@ -448,7 +448,7 @@
         storage_info.remove( "s3_key" );
 
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .addToPath( "export" ).post( ApiResponse.class, payload );
             fail( "Should not have passed as we were missing an important part of the payload" );
 
@@ -464,7 +464,7 @@
         storage_info.remove( "s3_access_id");
 
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .addToPath( "export" ).post( ApiResponse.class, payload );
             fail( "Should not have passed as we were missing an important part of the payload" );
 
@@ -480,7 +480,7 @@
         storage_info.remove( "bucket_location" );
 
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .addToPath( "export" ).post( ApiResponse.class, payload );
             fail( "Should not have passed as we were missing an important part of the payload" );
 
@@ -500,7 +500,7 @@
         storage_info.remove( "s3_key" );
 
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .app().addToPath( clientSetup.getAppUuid() )
                         .addToPath( "export" ).post( ApiResponse.class, payload );
             fail( "Should not have passed as we were missing an important part of the payload" );
@@ -517,7 +517,7 @@
         storage_info.remove( "s3_access_id" );
 
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .app().addToPath( clientSetup.getAppUuid() )
                         .addToPath( "export" ).post( ApiResponse.class, payload );
             fail( "Should not have passed as we were missing an important part of the payload" );
@@ -534,7 +534,7 @@
         storage_info.remove( "bucket_location" );
 
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .app().addToPath( clientSetup.getAppUuid() )
                         .addToPath( "export" ).post( ApiResponse.class, payload );
             fail( "Should not have passed as we were missing an important part of the payload" );
@@ -555,7 +555,7 @@
         storage_info.remove( "s3_key" );
 
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .app().addToPath( clientSetup.getAppUuid() )
                         .addToPath( "collection" ).addToPath( "users" )
                         .addToPath( "export" ).post( ApiResponse.class, payload );
@@ -573,7 +573,7 @@
         storage_info.remove( "s3_access_id" );
 
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .app().addToPath( clientSetup.getAppUuid() )
                         .addToPath( "collection" ).addToPath( "users" )
                         .addToPath( "export" ).post( ApiResponse.class, payload );
@@ -591,7 +591,7 @@
         storage_info.remove( "bucket_location" );
 
         try {
-            management().orgs().organization( clientSetup.getOrganizationName() )
+            management().orgs().org( clientSetup.getOrganizationName() )
                         .app().addToPath( clientSetup.getAppUuid() )
                         .addToPath( "collection" ).addToPath( "users" )
                         .addToPath( "export" ).post( ApiResponse.class, payload );
diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/management/ImportResourceIT.java b/stack/rest/src/test/java/org/apache/usergrid/rest/management/ImportResourceIT.java
index e33d488..34371b6 100644
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/management/ImportResourceIT.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/management/ImportResourceIT.java
@@ -138,7 +138,7 @@
         ///management/orgs/orgname/apps/appname/import
         Entity entity = this.management()
             .orgs()
-            .organization(org)
+            .org( org )
             .app()
             .addToPath(app)
             .addToPath("imports")
@@ -148,7 +148,7 @@
 
         entity = this.management()
             .orgs()
-            .organization(org)
+            .org( org )
             .app()
             .addToPath(app)
             .addToPath("imports")
@@ -175,7 +175,7 @@
         Entity payload = payloadBuilder();
 
         // /management/orgs/orgname/apps/appname/import
-        Entity entity = this.management().orgs().organization(org).app()
+        Entity entity = this.management().orgs().org( org ).app()
             .addToPath(app)
             .addToPath("imports")
             .post(Entity.class,payload);
@@ -183,7 +183,7 @@
         assertNotNull(entity);
 
         // test that you can access the organization using the currently set token.
-        this.management().orgs().organization(org).app().addToPath(app)
+        this.management().orgs().org( org ).app().addToPath(app)
             .addToPath("imports").addToPath(entity.getUuid().toString()).get();
 
         //create a new org/app
@@ -208,7 +208,7 @@
 
         //try to read with the new token, which should fail as unauthorized
         try {
-            this.management().orgs().organization(org).app().addToPath(app)
+            this.management().orgs().org( org ).app().addToPath(app)
                 .addToPath("imports").addToPath(entity.getUuid().toString()).get();
             fail("Should not be able to read import job with unauthorized token");
         } catch (UniformInterfaceException ex) {
@@ -228,7 +228,7 @@
         Entity payload = new Entity();
 
         try {
-            this.management().orgs().organization(org).app().addToPath(app).addToPath("imports").post(Entity.class,payload);
+            this.management().orgs().org( org ).app().addToPath(app).addToPath("imports").post(Entity.class,payload);
         } catch (UniformInterfaceException uie) {
             responseStatus = uie.getResponse().getClientResponseStatus();
         }
@@ -248,7 +248,7 @@
         properties.remove("storage_info");
 
         try {
-            this.management().orgs().organization(org).app().addToPath(app).addToPath("imports").post(Entity.class,payload);
+            this.management().orgs().org( org ).app().addToPath(app).addToPath("imports").post(Entity.class,payload);
         } catch (UniformInterfaceException uie) {
             responseStatus = uie.getResponse().getClientResponseStatus();
         }
@@ -270,7 +270,7 @@
 
 
         try {
-            this.management().orgs().organization(org).app().addToPath(app).addToPath("imports").post(Entity.class,payload);
+            this.management().orgs().org( org ).app().addToPath(app).addToPath("imports").post(Entity.class,payload);
         } catch (UniformInterfaceException uie) {
             responseStatus = uie.getResponse().getClientResponseStatus();
         }
@@ -293,7 +293,7 @@
         storage_info.remove("s3_key");
 
         try {
-            this.management().orgs().organization(org).app().addToPath(app).addToPath("imports").post(Entity.class,payload);
+            this.management().orgs().org( org ).app().addToPath(app).addToPath("imports").post(Entity.class,payload);
         } catch (UniformInterfaceException uie) {
             responseStatus = uie.getResponse().getClientResponseStatus();
         }
@@ -306,7 +306,7 @@
         storage_info.remove("s3_access_id");
 
         try {
-            this.management().orgs().organization(org).app().addToPath(app).addToPath("imports").post(Entity.class,payload);
+            this.management().orgs().org( org ).app().addToPath(app).addToPath("imports").post(Entity.class,payload);
         } catch (UniformInterfaceException uie) {
             responseStatus = uie.getResponse().getClientResponseStatus();
         }
@@ -319,7 +319,7 @@
         storage_info.remove("bucket_location");
 
         try {
-            this.management().orgs().organization(org).app().addToPath(app).addToPath("imports").post(Entity.class,payload);
+            this.management().orgs().org( org ).app().addToPath(app).addToPath("imports").post(Entity.class,payload);
         } catch (UniformInterfaceException uie) {
             responseStatus = uie.getResponse().getClientResponseStatus();
         }
@@ -438,7 +438,7 @@
 
         Entity importEntity = importCollection();
 
-        Entity importGet = this.management().orgs().organization( org ).app()
+        Entity importGet = this.management().orgs().org( org ).app()
             .addToPath(app)
             .addToPath( "imports" )
             .addToPath(importEntity.getUuid().toString())
@@ -446,7 +446,7 @@
 
         refreshIndex();
 
-        Entity importGetIncludes = this.management().orgs().organization(org).app()
+        Entity importGetIncludes = this.management().orgs().org( org ).app()
             .addToPath(app)
             .addToPath("imports")
             .addToPath(importEntity.getUuid().toString())
@@ -512,7 +512,7 @@
 
         Entity importEntity = importCollection();
 
-        Entity importGet = this.management().orgs().organization(org).app()
+        Entity importGet = this.management().orgs().org( org ).app()
             .addToPath(app)
             .addToPath("imports")
             .addToPath(importEntity.getUuid().toString()).get();
@@ -558,7 +558,7 @@
 
         Entity importEntity = importCollection();
 
-        Entity importGet = this.management().orgs().organization(org).app()
+        Entity importGet = this.management().orgs().org( org ).app()
             .addToPath(app)
             .addToPath("imports" )
             .addToPath(importEntity.getUuid().toString() )
@@ -610,13 +610,13 @@
 
         // we should now have 100 Entities in the default app
 
-        Entity importGet = this.management().orgs().organization( org ).app()
+        Entity importGet = this.management().orgs().org( org ).app()
             .addToPath( app )
             .addToPath("imports")
             .addToPath( importEntity.getUuid().toString() )
             .get();
 
-        Entity importGetIncludes = this.management().orgs().organization(org).app()
+        Entity importGetIncludes = this.management().orgs().org( org ).app()
             .addToPath(app)
             .addToPath("imports" )
             .addToPath(importEntity.getUuid().toString() )
@@ -654,7 +654,7 @@
             }});
         }});
 
-        Entity importEntity = this.management().orgs().organization(org).app()
+        Entity importEntity = this.management().orgs().org( org ).app()
             .addToPath(app)
             .addToPath("imports")
             .post(Entity.class,importPayload);
@@ -664,7 +664,7 @@
 
         while (retries++ < maxRetries) {
 
-            Entity importGet = this.management().orgs().organization(org).app()
+            Entity importGet = this.management().orgs().org( org ).app()
                 .addToPath( app )
                 .addToPath( "imports")
                 .addToPath( importEntity.getUuid().toString() )
diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/management/ManagementResourceIT.java b/stack/rest/src/test/java/org/apache/usergrid/rest/management/ManagementResourceIT.java
index 25736f7..c41735c 100644
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/management/ManagementResourceIT.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/management/ManagementResourceIT.java
@@ -70,7 +70,7 @@
     public void setSelfAdminPasswordAsAdwmin() {
         UUID uuid =  UUIDUtils.newTimeUUID();
         management.token().setToken(clientSetup.getSuperuserToken());
-        management.orgs().organization(clientSetup.getOrganizationName()).users().post(ApiResponse.class, new User("test" + uuid, "test" + uuid, "test" + uuid + "@email.com", "test"));
+        management.orgs().org( clientSetup.getOrganizationName() ).users().post(ApiResponse.class, new User("test" + uuid, "test" + uuid, "test" + uuid + "@email.com", "test"));
         Map<String, Object> data = new HashMap<>();
         data.put( "newpassword", "foo" );
         data.put( "oldpassword", "test" );
@@ -110,7 +110,7 @@
         String returnVal = "";
 
         try {
-            returnVal = this.management().orgs().organization(orgName).get(String.class);
+            returnVal = this.management().orgs().org( orgName ).get(String.class);
         }
         catch ( UniformInterfaceException uie ) {
             status = uie.getResponse().getClientResponseStatus();
@@ -122,7 +122,7 @@
         // this admin should have access to test org
         status = null;
         try {
-            this.management().orgs().organization(this.clientSetup.getOrganizationName()).get( String.class );
+            this.management().orgs().org( this.clientSetup.getOrganizationName() ).get( String.class );
         }
         catch ( UniformInterfaceException uie ) {
             status = uie.getResponse().getClientResponseStatus();
@@ -134,7 +134,7 @@
 
         status = null;
         try {
-            this.management().orgs().organization(this.clientSetup.getOrganizationName()).get( String.class );
+            this.management().orgs().org( this.clientSetup.getOrganizationName() ).get( String.class );
         }
         catch ( UniformInterfaceException uie ) {
             status = uie.getResponse().getClientResponseStatus();
@@ -246,7 +246,7 @@
 
 
         // POST /applications
-        ApiResponse apiResponse = management().orgs().organization(clientSetup.getOrganizationName()).app().post(new Application("mgmt-org-app"));
+        ApiResponse apiResponse = management().orgs().org( clientSetup.getOrganizationName() ).app().post(new Application("mgmt-org-app"));
 
 
         refreshIndex();
@@ -268,7 +268,7 @@
         // GET /applications/mgmt-org-app
 
 
-        Entity app = management().orgs().organization(clientSetup.getOrganizationName()).app().addToPath("mgmt-org-app").get();
+        Entity app = management().orgs().org( clientSetup.getOrganizationName() ).app().addToPath("mgmt-org-app").get();
 
 
         assertEquals(this.clientSetup.getOrganizationName().toLowerCase(), app.get("organizationName").toString());
@@ -327,7 +327,7 @@
         Map<String, Object> properties = new HashMap<String, Object>();
         properties.put( "securityLevel", 5 );
         payload.put( OrganizationsResource.ORGANIZATION_PROPERTIES, properties );
-        management.orgs().organization(clientSetup.getOrganizationName())
+        management.orgs().org( clientSetup.getOrganizationName() )
             .put(payload);
 
 
diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/management/OrganizationsIT.java b/stack/rest/src/test/java/org/apache/usergrid/rest/management/OrganizationsIT.java
index 4385a4c..8a298f6 100644
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/management/OrganizationsIT.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/management/OrganizationsIT.java
@@ -19,9 +19,7 @@
 
 import java.io.IOException;
 import java.util.HashMap;
-import java.util.LinkedHashMap;
 import java.util.Map;
-import java.util.UUID;
 
 import org.apache.usergrid.rest.test.resource2point0.model.*;
 import org.junit.Ignore;
@@ -82,7 +80,7 @@
         //this.refreshIndex();
 
         //Assert that the get returns the correct org and owner.
-        Organization returnedOrg = clientSetup.getRestClient().management().orgs().organization( organization.getOrganization()).get();
+        Organization returnedOrg = clientSetup.getRestClient().management().orgs().org( organization.getOrganization() ).get();
 
         assertTrue( returnedOrg != null && returnedOrg.getName().equals( organization.getOrganization() ) );
 
@@ -278,7 +276,7 @@
         this.management().token().setToken(tokenReturned);
 
         //Assert that the get returns the correct org and owner.
-        Organization returnedOrg = clientSetup.getRestClient().management().orgs().organization( organization.getOrganization() ).get();
+        Organization returnedOrg = clientSetup.getRestClient().management().orgs().org( organization.getOrganization() ).get();
 
         assertTrue(returnedOrg != null && returnedOrg.getName().equals(organization.getOrganization()));
 
@@ -295,7 +293,7 @@
 
         try {
             //Delete default organization
-            clientSetup.getRestClient().management().orgs().organization( clientSetup.getOrganizationName() ).delete();
+            clientSetup.getRestClient().management().orgs().org( clientSetup.getOrganizationName() ).delete();
             fail( "Delete is not implemented yet" );
         }catch(UniformInterfaceException uie){
             assertEquals( ClientResponse.Status.NOT_IMPLEMENTED ,uie.getResponse().getStatus());
@@ -320,7 +318,7 @@
         adminUserPayload.put("password", username);
 
         //create adminUser
-        ApiResponse adminUserEntityResponse = management().orgs().organization( clientSetup.getOrganizationName() ).users().post(ApiResponse.class, adminUserPayload);
+        ApiResponse adminUserEntityResponse = management().orgs().org( clientSetup.getOrganizationName() ).users().post(ApiResponse.class, adminUserPayload);
 
         Entity adminUserResponse = new Entity(adminUserEntityResponse);
         //verify that the response contains the correct data
@@ -357,12 +355,12 @@
         orgPayload.put( "properties", properties );
 
         //update the organization.
-        management().orgs().organization( clientSetup.getOrganizationName() ).put(orgPayload);
+        management().orgs().org( clientSetup.getOrganizationName() ).put(orgPayload);
 
         this.refreshIndex();
 
         //retrieve the organization
-        Organization orgResponse = management().orgs().organization( clientSetup.getOrganizationName() ).get();
+        Organization orgResponse = management().orgs().org( clientSetup.getOrganizationName() ).get();
 
         assertEquals(5, orgResponse.getProperties().get("puppies" ));
 
@@ -371,11 +369,11 @@
         orgPayload.put("properties", properties );
 
         //update the organization.
-        management().orgs().organization( clientSetup.getOrganizationName()).put(orgPayload);
+        management().orgs().org( clientSetup.getOrganizationName() ).put(orgPayload);
 
         this.refreshIndex();
 
-        orgResponse = management().orgs().organization( clientSetup.getOrganizationName() ).get();
+        orgResponse = management().orgs().org( clientSetup.getOrganizationName() ).get();
 
         assertEquals( 6, orgResponse.getProperties().get( "puppies" ));
 
diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/management/RegistrationIT.java b/stack/rest/src/test/java/org/apache/usergrid/rest/management/RegistrationIT.java
index 2972126..4d85ade 100644
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/management/RegistrationIT.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/management/RegistrationIT.java
@@ -24,7 +24,6 @@
 import org.apache.usergrid.rest.test.resource2point0.AbstractRestIT;
 import org.apache.usergrid.rest.test.resource2point0.model.*;
 
-import org.junit.Ignore;
 import org.junit.Test;
 import org.jvnet.mock_javamail.Mailbox;
 import org.slf4j.Logger;
@@ -86,7 +85,7 @@
         ApiResponse user = this
             .management()
             .orgs()
-            .organization(organizationName)
+            .org( organizationName )
             .users()
             .post(new User().chainPut("email", email).chainPut("password", password));
 
@@ -133,7 +132,7 @@
                     .queryParam("access_token", t).accept(MediaType.APPLICATION_JSON)
                     .type(MediaType.APPLICATION_FORM_URLENCODED).put(String.class, form);
             } catch (UniformInterfaceException e) {
-                assertEquals("Should receive a 400 Not Found", 400, e.getResponse().getStatus());
+                assertEquals("Should receive a 404 Not Found", 404, e.getResponse().getStatus());
             }
         } finally {
             setTestProperties(originalProperties);
@@ -207,7 +206,7 @@
             this
                 .management()
                 .orgs()
-                .organization(this.clientSetup.getOrganizationName())
+                .org( this.clientSetup.getOrganizationName() )
                 .users()
                 .getResource( false )
                 .queryParam( "access_token", token )
diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/management/organizations/AdminEmailEncodingIT.java b/stack/rest/src/test/java/org/apache/usergrid/rest/management/organizations/AdminEmailEncodingIT.java
index a78f4fd..ceab55d 100644
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/management/organizations/AdminEmailEncodingIT.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/management/organizations/AdminEmailEncodingIT.java
@@ -28,7 +28,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
 import java.util.UUID;
 
 import static junit.framework.TestCase.assertNotNull;
@@ -119,7 +118,7 @@
         //Instruct the test framework to use the new token
         this.app().token().setToken(tokenReturned);
         //Create an application within the organization
-        clientSetup.getRestClient().management().orgs().organization(organization.getName()).app().post(new Application(app));
+        clientSetup.getRestClient().management().orgs().org( organization.getName() ).app().post(new Application(app));
 
         //retrieve the new management user by username and ensure the username and email address matches the input
         Entity me = clientSetup.getRestClient().management().users().entity(username).get();
diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/ClientSetup.java b/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/ClientSetup.java
index 2654184..821b80a 100644
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/ClientSetup.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/ClientSetup.java
@@ -27,7 +27,6 @@
 import org.apache.usergrid.rest.test.resource2point0.model.ApiResponse;
 import org.apache.usergrid.rest.test.resource2point0.model.Application;
 import org.apache.usergrid.rest.test.resource2point0.model.Credentials;
-import org.apache.usergrid.rest.test.resource2point0.model.Entity;
 import org.apache.usergrid.rest.test.resource2point0.model.Token;
 import org.junit.rules.TestRule;
 import org.junit.runner.Description;
@@ -38,8 +37,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.ws.rs.core.MediaType;
-
 
 /**
  * This class is used to setup the client rule that will setup the RestClient and create default applications.
@@ -123,11 +120,11 @@
         restClient.management().token().get(username,password);
 
         // refreshIndex();
-        clientCredentials = restClient.management().orgs().organization( orgName ).credentials().get(Credentials.class);
+        clientCredentials = restClient.management().orgs().org( orgName ).credentials().get(Credentials.class);
         //refreshIndex();
 
 
-        ApiResponse appResponse = restClient.management().orgs().organization(organization.getName()).app().post(new Application(appName));
+        ApiResponse appResponse = restClient.management().orgs().org( organization.getName() ).app().post(new Application(appName));
         appUuid = ( String ) appResponse.getEntities().get( 0 ).get( "uuid" );
         refreshIndex();
 
diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/ApplicationsResource.java b/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/ApplicationsResource.java
index d06322c..f789272 100644
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/ApplicationsResource.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/ApplicationsResource.java
@@ -55,4 +55,11 @@
         return mapper.readValue(
             new StringReader(responseString), ManagementResponse.class);
     }
+
+
+
+    public ApplicationResource app( final String appName ){
+        return new ApplicationResource( appName,context,this );
+    }
+
 }
diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/OrgResource.java b/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/OrgResource.java
index d87bf91..cd7165c 100644
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/OrgResource.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/OrgResource.java
@@ -51,7 +51,7 @@
     }
 
 
-    public OrganizationResource organization (final String orgname){
+    public OrganizationResource org( final String orgname ){
         return new OrganizationResource( orgname,context,this );
     }
 
diff --git a/stack/services/src/main/java/org/apache/usergrid/management/cassandra/ManagementServiceImpl.java b/stack/services/src/main/java/org/apache/usergrid/management/cassandra/ManagementServiceImpl.java
index 5c4262d..6f4e675 100644
--- a/stack/services/src/main/java/org/apache/usergrid/management/cassandra/ManagementServiceImpl.java
+++ b/stack/services/src/main/java/org/apache/usergrid/management/cassandra/ManagementServiceImpl.java
@@ -1892,12 +1892,8 @@
             return null;
         }
         EntityManager em = emf.getEntityManager( smf.getManagementAppId() );
-        EntityRef mgmtAppRef = new SimpleEntityRef( Schema.TYPE_APPLICATION, smf.getManagementAppId() );
 
-        final Results results = em.searchCollection(mgmtAppRef, CpNamingUtils.DELETED_APPLICATION_INFOS,
-            Query.fromQL("select * where " + PROPERTY_APPLICATION_ID + " = " + applicationId.toString()));
-
-        Entity entity = results.getEntity();
+        final Entity entity = em.get( new SimpleEntityRef( CpNamingUtils.DELETED_APPLICATION_INFO, applicationId ) );
 
         if ( entity != null ) {
             return new ApplicationInfo( applicationId, entity.getName() );
